1. Introduction

1.1 Problem Statement / Use Case

Watauga County, North Carolina, is currently experiencing a housing shortage that is expected to intensify in the near future. The shortage is exacerbated by vacation rentals and student housing, which has significantly reduced the available residential housing options. The Watauga Housing Solutions Committee is partnering with other community and local government organizations looking to develop affordable and workforce housing in order to mitigate the severe decreases in housing affordability. They are working with a developer to prioritize the most feasible sites to pursue for purchase and development. Because of the extreme physical conditions of the landscape (slope, soils, etc.), there is currently no streamlined system in place to help identify suitable parcels for development. In response to this issue, we have been contracted to develop an application-based data framework that is designed to identify land parcels based on their likelihood to be developed for affordable workforce housing. This data framework will be designed to function as an interactive application interface that will allow users to input criteria related to land supply and combine it with likelihood estimates to rank each parcel in the county in terms of development suitability.

1.2 Project Client

The main project client is the Watauga Housing Council and its Housing Solutions Committee. This organization is tasked with responding to the economic, environmental, and social aspects of the county to provide adequate housing options for all residents. Our main points of contacts within the housing council are Dr. Kellie Reed Ashcraft (Facilitator/Organizer, Watauga Housing Council), Dr. Chris Quattro (Assistant Professor, Appalachian State University/Member, Watauga Housing Council), Laura Beach (Member, Watauga Housing Council).

1.3 Dependent Variable

The key indicator for development that will be used is the administrative record associated with septic system permits. This permit is exclusively granted when a property satisfies the requirements for both land supply and developer demand at that specific site. Due to the rural nature of the project area, there is relatively low wastewater sewer coverage. Subsequently, a septic system is critical for new development, and a site cannot be developed without one. Our approach will involve identifying the site suitability characteristics (e.g., slope, soil type) most closely related to the probability of a parcel receiving a septic permit. Using this information, we will forecast the likelihood that a given parcel will receive a new septic permit, which is the dependent variable.

2. Exploratory Data Analysis

2.1 Demographic

(1) Population Size

In 2017, Watauga County was home to 53,421 people. Increasing to 54,540 by 2022, the county is showing steady increases in population over the last 5 years. As more people call the county home, it is increasingly important for the Housing Council to address future housing needs.

(2) Median Age

Watauga’s median age has increased sharply over the last five years. In 2017, the median age was 30.6, rising 1.5 years to 32.1 in 2022. However, Watauga remains significantly younger than the surrounding area, which tends towards the mid/upper 40s, likely due to the strong student population.

(3) Average Household Size

In 2017, the median household size in Watauga County was 2.35. Decreasing slightly in 2022 at 2.30, household size largely mirrors those of surrounding counties, which all experience households of approximately 2-3 people. This suggests that many homes in the area are families, rather than just individuals or couples living together.

(4) Median Income

In 2022, Watauga County saw a median household income of $50,034. This is on par with the surrounding counties of Ashe, Avery, Caldwell, and Wilkes, which fell within $3,000 of this range. ($49,176-$53,313). The county experiences relatively low incomes, compared to the national median of $74,580.

2.2 Housing

(1) Housing by Occupancy Type (Own vs. Rent)

As of 2022, approximately two-thirds of homes in the County are owner-occupied (61%). When considered alongside the large youth and student population associated with Appalachian State, it becomes clearer that most adults without association to the university are homeowners.

(2) Rent Burden

A household is considered rent burdened if they spend more than 30% of their monthly income on housing. This metric is key in determining the financial health of the residents, as well as current conditions of the housing market. Northwest North Carolina has been trending lower in rent burden, with many counties seeing a decrease in burden over the last five years. However, the story is different when it comes to Watauga, which has seen an uptick in rent burden since 2017.

Currently, more than two-thirds of residents are rent burdened, signaling an unstable housing market. This is a key indicator for our project’s use case, as the County continues to search for solutions for making housing more affordable and accessible for its residents and families.

(3) House Price / Ownership Burden

The median house value is $283,000, which is roughly the same value as the nationwide average property value. The ownership affordability improved in the past five years, as 14.4% of the ownership houses are not affordable, which decreased from 15.6% in 2017. The ownership affordability is also better than the national average, which is 16.8%.

(4) Student Population

Within Watauga County sits Appalachian State University, a public four-year university that serves over 18,000 students. The surge of student populations is felt throughout Boone and surrounding areas, and plays a large role in the County’s economy. As of 2022, around 30% of Watauga’s population was college students, a slight increase in the last five years. When planning for existing and future housing needs, the Housing Council should consider the student population, as well as housing that can continue to provide as graduates settle elsewhere in the County and find jobs.

(5) Number of Households by Vehicles Owned

Watauga is largely a car-dominated community, with nearly every household owning at least one car. In fact, according to the Census, about 14,000 households have 2 or more, suggesting that almost every adult in the county has access to their own car, and may not need to share with a spouse or other housemate. Mobility habits can be ascertained, such as the need to travel far distances for daily trips such as the commute to work or to get groceries.

2.3 Dependent Variable - Septic Permit

We used the number of new septic permits within each parcel as our model’s dependent variable. Watauga County approved 300 new septic permits in 2017. The number increased to 472 in 2022. The data indicates a 57.33% increase in the number of septic permits over the five-year period. The number of septic permits is a critical indicator of development and land use change. The increase in septic permits suggests a significant increase in new development and land use change in Watauga County over the past five years.

2.4 Physical Features

(1) Land Cover

(a) Land Cover - 2021 (latest data)

The Watauga County 2021 land cover underscores the county’s rich natural resources and moderate urban development. The total land cover area is predominantly forested land (74.56%), with 54.16% of the county’s land cover area being deciduous forest and 19.2% mixed forest, and 1.2% evergreen forest. Developed areas, which is limited to about 13.89% of the total land cover area is made up of 11.23% of developed open space, 1.48% developed low intensity, 0.9% developed medium density, 0.28% developed high intensity. The majority of development is classified as open space, which could encompass parks, golf courses, or agricultural land that adds to the rural character of the county. The incrementally smaller percentages for low, medium, and high-intensity developments indicate concentrated urbanization around cities and transportation corridors, reflecting strategic land use planning that preserves the natural landscape while accommodating residential and commercial needs.

(b) Land Cover - Changes Over 10 Years

From 2011 and 2021 Watauga County witnessed a notable shift in land cover, particularly in terms of development and the reduction of natural landscapes like grasslands and shrub lands. The data indicates a 13.89% increase in developed areas, with significant growth in low, medium, and high-intensity developments. Most notably, medium intensity development saw a significant increase of 17.22% in 2021. Concurrently, the county experienced a dramatic 56.5% decrease in Grassland/Herbaceous areas and a 50% reduction in Shrub/Scrub land. These changes could be attributed to several factors, including the conversion of open fields and grasslands into developed land or possibly into agricultural use. The majority of the land cover remains natural or semi-natural, with developed open spaces also experiencing a small rise. The data suggests a careful balance between development and the maintenance of natural land covers over the past decade.

2011-2021

2011

2013

2016

2019

2021

(2) Slope

As a mountainous area, the new developments highly depend on the topography. The slope is a critical factor in determining the feasibility of development. The steeper the slope, the more challenging it is to develop. We used the slope data to identify the areas with steep slopes, which are less likely to be developed.

\nAs 65%(≈33.02°) is the maximum slope suitable for development, we will use 25° as a threshold to identify the areas unsuitable for developments.The plot below shows th reclassified slope degree in the county. The green areas are suitable for development, while the white areas are unsuitable for development.

(3) Distance to Landslide

Landslides pose the primary hazard in Watauga County, and the safety of each parcel correlates with its distance from landslide-prone areas. Illustrated in the provided figure, the northeastern region of Watauga emerges as the safest zone. This safety is partly attributable to the gentle slope characteristic of this particular area.

Note: The white lines in the plots represent gaps between the parcels. They often correlate with streams or roads.

(4) Distance to Watershed

Water supply plays a crucial role in Watauga County’s landscape. Given the potential environmental ramifications, it’s imperative to maintain a safe distance between the septic systems and the water supply areas. Through comprehensive analysis, it’s evident that the middle region of Watauga County is adjacent to these critical water supply zones. Consequently, when installing septic systems in this area, careful attention must be paid to mitigating environmental risks and preventing water pollution.

Note: The white lines in the plots represent gaps between the parcels. They often correlate with streams or roads.

(5) Distance to Nearest Road

Accessibility to transportation infrastructure significantly influences the development potential of a parcel. Typically, proximity to the road network directly correlates with higher accessibility. However, the graphic reveals certain parcels lacking adequate access to roads, indicating potential limitations in their development value. Through the analysis we can see that south-west and north-east Watauga are less connected.

Note: The white lines in the plots represent gaps between the parcels. They often correlate with streams or roads.

(6) Distance to Nearest Water Body

The presence of water bodies is integral to our evaluation framework. They significantly influence the water table, consequently affecting the design and placement of septic systems. Watauga County boasts a dense network of waterways. Despite this, we prioritize calculating the distance from the center of mass to the nearest river in our assessments. Overall, the variance in proximity to water bodies among parcels is minimal.

Note: The white lines in the plots represent gaps between the parcels. They often correlate with streams or roads.

(7) Soil

There are over 80 types of soil in Watauga county. The soil type is important for the septic system design and installation. The soil type will also affect the water absorption rate and the depth of the septic system. After searched on the soil database of USDA (United States Department of Agriculture) website, we found that the soil type is classified by the MUSYM (Map Unit Symbol) column. We aggregated the soil type into 3 main categories based on the drainage ability and permeability of the soil. The 3 categories are A-Moderately Rapid Infiltration Rate, B-Moderate Infiltration Rate, C-Low Infiltration Rate. The C type low-infiltration rate and well-drained soil is the best for septic system installation, and the poorly drained soil is the worst.

(8) Natural Area

Watauga County is home to numerous sites designated as natural heritage areas or significant natural areas, recognized at national, state, regional, or county levels. These areas, protected through ownership by federal or state entities or held in private hands, serve as critical habitats for biodiversity, cultural heritage sites, or natural resources. Understanding the precise locations of these protected sites is essential for identifying parcels suitable for development while ensuring conservation efforts are respected.

2.5 Economic Features

(1) Property Value

Property value is a critical factor in determining the development potential of a parcel. It is a direct reflection of the market demand and the potential return on investment. The property value is calculated based on the sale price of the property. The higher the property value, the higher the development potential.

3. Next Steps

3.1 Feature Engineering

Besides the features we have already extracted, we will also consider more economic features into our model. Based on the features we have, we will also do some feature engineering to create new features and join the data to parcel. For example, we’re going to calculate the average, minimum and maximum slope of the parcel.

After joining features with the parcels, we will try to test the variable correlations between the target variable (Number of Septic permits in each parcel) and the features. Based on the variable correlation significance, we will try to select the most important features for the model.

3.2 Machine Learning Model

On the basis of the variables from the past 5 years we have, we will try to build a machine learning model to predict the number of septic permits in each parcel. We will try to use different models to predict the number of septic permits, such as linear regression, random forest, and gradient boosting. We will also try to use different feature selection methods to select the most important features for the model. Then we will compare the performance of different models and feature selection methods to find the best model for our prediction.

Then, we plan to improve our baseline model with several different methods, such as hyper-parameter tuning, cross-validation, and ensemble learning. We will also try to use different metrics to evaluate the model performance, such as RMSE, MAE, and R-squared.

3.3 Interactive Application

The last step we plan to do is to develop an interactive dashboard to visualize and enable the clients to interact with the data more easily. In the dashboard, we will include the data dashboard and the machine learning model prediction result on the map as suggestions for Watauga’s future development.

LS0tCnRpdGxlOiAiV2F0YXVnYSAtIFByaW9yaXRpemF0aW9uIEFzc2Vzc21lbnQgVG9vbCBmb3IgV29ya2ZvcmNlIEhvdXNpbmcgTGFuZCBQYXJjZWwgRGV2ZWxvcG1lbnQgKE1hcmtkb3duIHYyKSIKYXV0aG9yOiAiSmluZ3lpIENhaSwgQWxpY2UgSGFuLCBZaW5hbiBMaSwgSmFycmVkIFJhbmRhbGwsIEthdGhsZWVuIFNjb3BpcyIKZGF0ZTogIjIwMjQtMDQtMDkiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICBjb2RlX2Rvd25sb2FkOiB0cnVlCmtuaXRyOgogIGVjaG86IGZhbHNlCiAgbWVzc2FnZTogZmFsc2UKICB3YXJuaW5nOiBmYWxzZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoKa25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLCB3YXJuaW5nID0gRkFMU0UsIHJlc3VsdHM9J2hpZGUnLCBmaWcua2VlcD0nYWxsJywgY2FjaGUgPSBUUlVFKQpgYGAKCmBgYHtyIExpYnJhcnksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgaW5zdGFsbC5wYWNrYWdlcygic3BhdHN0YXQiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygic3BhdHN0YXQuZXhwbG9yZSIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJGZWREYXRhIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQojIGluc3RhbGwucGFja2FnZXMoImFuaW1hdGlvbiIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJyYXN0ZXJWaXMiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygicmFzdGVyIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQojIGluc3RhbGwucGFja2FnZXMoInRpZHl2ZXJzZSIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJyZ2RhbCIsIHJlcG9zID0gImh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciLCB0eXBlID0gInNvdXJjZSIpCiMgaW5zdGFsbC5wYWNrYWdlcygidGlkeWNlbnN1cyIpCiMgaW5zdGFsbC5wYWNrYWdlcygic3RyaW5naSIpCiMgaW5zdGFsbC5wYWNrYWdlcygic3AiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygia2FibGVFeHRyYSIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJzeXN0ZW1mb250cyIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJoaWdociIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJqcXVlcnlsaWIiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygic2FzcyIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJjYWNoZW0iLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygiUlNvY3JhdGEiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZ3JpZEV4dHJhIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQojIGluc3RhbGwucGFja2FnZXMoInNwZGVwIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQojIGluc3RhbGwucGFja2FnZXMoIkZOTiIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJncmlkIiwgcmVwb3M9Imh0dHA6Ly9jcmFuLnItcHJvamVjdC5vcmciKQojIGluc3RhbGwucGFja2FnZXMoImthYmxlRXh0cmEiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygiY2xhc3NJbnQiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygibWFwdmlldyIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJjcm9zc3RhbGsiLCByZXBvcz0iaHR0cDovL2NyYW4uci1wcm9qZWN0Lm9yZyIpCiMgaW5zdGFsbC5wYWNrYWdlcygiZ2dwbG90MiIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJyZXNoYXBlMiIsIHJlcG9zPSJodHRwOi8vY3Jhbi5yLXByb2plY3Qub3JnIikKIyBpbnN0YWxsLnBhY2thZ2VzKCJyZ2RhbCIpCgpsaWJyYXJ5KFJTb2NyYXRhKQpsaWJyYXJ5KHZpcmlkaXMpIApsaWJyYXJ5KHNwYXRzdGF0KQpsaWJyYXJ5KHNwZGVwKQpsaWJyYXJ5KEZOTikKbGlicmFyeShncmlkKQpsaWJyYXJ5KGdyaWRFeHRyYSkKbGlicmFyeShrYWJsZUV4dHJhKQpsaWJyYXJ5KGNsYXNzSW50KSAgICMgZm9yIEtERSBhbmQgTUwgcmlzayBjbGFzcyBpbnRlcnZhbHMKbGlicmFyeShtYXB2aWV3KQpsaWJyYXJ5KEZlZERhdGEpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmxpYnJhcnkoc2YpCmxpYnJhcnkoc3ApCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkocmFzdGVyKSAKbGlicmFyeShhbmltYXRpb24pCmxpYnJhcnkocmFzdGVyVmlzKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikgCmxpYnJhcnkoZ2dwbG90MikgICAgICAKbGlicmFyeShjb2xvcnNwYWNlKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KHJlYWRyKQpsaWJyYXJ5KHNmKQpsaWJyYXJ5KHRlcnJhKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmxpYnJhcnkocmVzaGFwZTIpCgojIGR1bW15IDwtIHJlYWQuY3N2KCIvVXNlcnMvYWxpY2UvRG93bmxvYWRzL2xhbmRjb3Zlcl9sZWdlbmQuY3N2IikKIyBmdW5jdGlvbnMKcm9vdC5kaXIgPSAiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3VyYmFuU3BhdGlhbC9QdWJsaWMtUG9saWN5LUFuYWx5dGljcy1MYW5kaW5nL21hc3Rlci9EQVRBLyIKCnNvdXJjZSgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3VyYmFuU3BhdGlhbC9QdWJsaWMtUG9saWN5LUFuYWx5dGljcy1MYW5kaW5nL21hc3Rlci9mdW5jdGlvbnMuciIpCmNvbG9yX3BhbGV0dGUgPC0gYygiI2UyYTMzNCIsICIjZjliZjNlIiwgIiNmY2Q5NzciLCAiIzlhZDdkMiIsICIjNzRjMWI5IikKYGBgCgojIDEuIEludHJvZHVjdGlvbgoKIyMgMS4xIFByb2JsZW0gU3RhdGVtZW50IC8gVXNlIENhc2UKCldhdGF1Z2EgQ291bnR5LCBOb3J0aCBDYXJvbGluYSwgaXMgY3VycmVudGx5IGV4cGVyaWVuY2luZyBhIGhvdXNpbmcgc2hvcnRhZ2UgdGhhdCBpcyBleHBlY3RlZCB0byBpbnRlbnNpZnkgaW4gdGhlIG5lYXIgZnV0dXJlLiBUaGUgc2hvcnRhZ2UgaXMgZXhhY2VyYmF0ZWQgYnkgdmFjYXRpb24gcmVudGFscyBhbmQgc3R1ZGVudCBob3VzaW5nLCB3aGljaCBoYXMgc2lnbmlmaWNhbnRseSByZWR1Y2VkIHRoZSBhdmFpbGFibGUgcmVzaWRlbnRpYWwgaG91c2luZyBvcHRpb25zLiBUaGUgV2F0YXVnYSBIb3VzaW5nIFNvbHV0aW9ucyBDb21taXR0ZWUgaXMgcGFydG5lcmluZyB3aXRoIG90aGVyIGNvbW11bml0eSBhbmQgbG9jYWwgZ292ZXJubWVudCBvcmdhbml6YXRpb25zIGxvb2tpbmcgdG8gZGV2ZWxvcCBhZmZvcmRhYmxlIGFuZCB3b3JrZm9yY2UgaG91c2luZyBpbiBvcmRlciB0byBtaXRpZ2F0ZSB0aGUgc2V2ZXJlIGRlY3JlYXNlcyBpbiBob3VzaW5nIGFmZm9yZGFiaWxpdHkuIFRoZXkgYXJlIHdvcmtpbmcgd2l0aCBhIGRldmVsb3BlciB0byBwcmlvcml0aXplIHRoZSBtb3N0IGZlYXNpYmxlIHNpdGVzIHRvIHB1cnN1ZSBmb3IgcHVyY2hhc2UgYW5kIGRldmVsb3BtZW50LiBCZWNhdXNlIG9mIHRoZSBleHRyZW1lIHBoeXNpY2FsIGNvbmRpdGlvbnMgb2YgdGhlIGxhbmRzY2FwZSAoc2xvcGUsIHNvaWxzLCBldGMuKSwgdGhlcmUgaXMgY3VycmVudGx5IG5vIHN0cmVhbWxpbmVkIHN5c3RlbSBpbiBwbGFjZSB0byBoZWxwIGlkZW50aWZ5IHN1aXRhYmxlIHBhcmNlbHMgZm9yIGRldmVsb3BtZW50LiBJbiByZXNwb25zZSB0byB0aGlzIGlzc3VlLCB3ZSBoYXZlIGJlZW4gY29udHJhY3RlZCB0byBkZXZlbG9wIGFuIGFwcGxpY2F0aW9uLWJhc2VkIGRhdGEgZnJhbWV3b3JrIHRoYXQgaXMgZGVzaWduZWQgdG8gaWRlbnRpZnkgbGFuZCBwYXJjZWxzIGJhc2VkIG9uIHRoZWlyIGxpa2VsaWhvb2QgdG8gYmUgZGV2ZWxvcGVkIGZvciBhZmZvcmRhYmxlIHdvcmtmb3JjZSBob3VzaW5nLiBUaGlzIGRhdGEgZnJhbWV3b3JrIHdpbGwgYmUgZGVzaWduZWQgdG8gZnVuY3Rpb24gYXMgYW4gaW50ZXJhY3RpdmUgYXBwbGljYXRpb24gaW50ZXJmYWNlIHRoYXQgd2lsbCBhbGxvdyB1c2VycyB0byBpbnB1dCBjcml0ZXJpYSByZWxhdGVkIHRvIGxhbmQgc3VwcGx5IGFuZCBjb21iaW5lIGl0IHdpdGggbGlrZWxpaG9vZCBlc3RpbWF0ZXMgdG8gcmFuayBlYWNoIHBhcmNlbCBpbiB0aGUgY291bnR5IGluIHRlcm1zIG9mIGRldmVsb3BtZW50IHN1aXRhYmlsaXR5LgoKIyMgMS4yIFByb2plY3QgQ2xpZW50CgpUaGUgbWFpbiBwcm9qZWN0IGNsaWVudCBpcyB0aGUgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwgYW5kIGl0cyBIb3VzaW5nIFNvbHV0aW9ucyBDb21taXR0ZWUuIFRoaXMgb3JnYW5pemF0aW9uIGlzIHRhc2tlZCB3aXRoIHJlc3BvbmRpbmcgdG8gdGhlIGVjb25vbWljLCBlbnZpcm9ubWVudGFsLCBhbmQgc29jaWFsIGFzcGVjdHMgb2YgdGhlIGNvdW50eSB0byBwcm92aWRlIGFkZXF1YXRlIGhvdXNpbmcgb3B0aW9ucyBmb3IgYWxsIHJlc2lkZW50cy4gT3VyIG1haW4gcG9pbnRzIG9mIGNvbnRhY3RzIHdpdGhpbiB0aGUgaG91c2luZyBjb3VuY2lsIGFyZSBEci4gS2VsbGllIFJlZWQgQXNoY3JhZnQgKEZhY2lsaXRhdG9yL09yZ2FuaXplciwgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwpLCBEci4gQ2hyaXMgUXVhdHRybyAoQXNzaXN0YW50IFByb2Zlc3NvciwgQXBwYWxhY2hpYW4gU3RhdGUgVW5pdmVyc2l0eS9NZW1iZXIsIFdhdGF1Z2EgSG91c2luZyBDb3VuY2lsKSwgTGF1cmEgQmVhY2ggKE1lbWJlciwgV2F0YXVnYSBIb3VzaW5nIENvdW5jaWwpLgoKIyMgMS4zIERlcGVuZGVudCBWYXJpYWJsZQoKVGhlIGtleSBpbmRpY2F0b3IgZm9yIGRldmVsb3BtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGlzIHRoZSBhZG1pbmlzdHJhdGl2ZSByZWNvcmQgYXNzb2NpYXRlZCB3aXRoIHNlcHRpYyBzeXN0ZW0gcGVybWl0cy4gVGhpcyBwZXJtaXQgaXMgZXhjbHVzaXZlbHkgZ3JhbnRlZCB3aGVuIGEgcHJvcGVydHkgc2F0aXNmaWVzIHRoZSByZXF1aXJlbWVudHMgZm9yIGJvdGggbGFuZCBzdXBwbHkgYW5kIGRldmVsb3BlciBkZW1hbmQgYXQgdGhhdCBzcGVjaWZpYyBzaXRlLiBEdWUgdG8gdGhlIHJ1cmFsIG5hdHVyZSBvZiB0aGUgcHJvamVjdCBhcmVhLCB0aGVyZSBpcyByZWxhdGl2ZWx5IGxvdyB3YXN0ZXdhdGVyIHNld2VyIGNvdmVyYWdlLiBTdWJzZXF1ZW50bHksIGEgc2VwdGljIHN5c3RlbSBpcyBjcml0aWNhbCBmb3IgbmV3IGRldmVsb3BtZW50LCBhbmQgYSBzaXRlIGNhbm5vdCBiZSBkZXZlbG9wZWQgd2l0aG91dCBvbmUuIE91ciBhcHByb2FjaCB3aWxsIGludm9sdmUgaWRlbnRpZnlpbmcgdGhlIHNpdGUgc3VpdGFiaWxpdHkgY2hhcmFjdGVyaXN0aWNzIChlLmcuLCBzbG9wZSwgc29pbCB0eXBlKSBtb3N0IGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgcHJvYmFiaWxpdHkgb2YgYSBwYXJjZWwgcmVjZWl2aW5nIGEgc2VwdGljIHBlcm1pdC4gVXNpbmcgdGhpcyBpbmZvcm1hdGlvbiwgd2Ugd2lsbCBmb3JlY2FzdCB0aGUgbGlrZWxpaG9vZCB0aGF0IGEgZ2l2ZW4gcGFyY2VsIHdpbGwgcmVjZWl2ZSBhIG5ldyBzZXB0aWMgcGVybWl0LCB3aGljaCBpcyB0aGUgZGVwZW5kZW50IHZhcmlhYmxlLgoKIyAyLiBFeHBsb3JhdG9yeSBEYXRhIEFuYWx5c2lzCgojIyAyLjEgRGVtb2dyYXBoaWMKCiMjIyAoMSkgUG9wdWxhdGlvbiBTaXplCgpJbiAyMDE3LCBXYXRhdWdhIENvdW50eSB3YXMgaG9tZSB0byA1Myw0MjEgcGVvcGxlLiBJbmNyZWFzaW5nIHRvIDU0LDU0MCBieSAyMDIyLCB0aGUgY291bnR5IGlzIHNob3dpbmcgc3RlYWR5IGluY3JlYXNlcyBpbiBwb3B1bGF0aW9uIG92ZXIgdGhlIGxhc3QgNSB5ZWFycy4gQXMgbW9yZSBwZW9wbGUgY2FsbCB0aGUgY291bnR5IGhvbWUsIGl0IGlzIGluY3JlYXNpbmdseSBpbXBvcnRhbnQgZm9yIHRoZSBIb3VzaW5nIENvdW5jaWwgdG8gYWRkcmVzcyBmdXR1cmUgaG91c2luZyBuZWVkcy4KCmBgYHtyIHBvcHVsYXRpb25fc2l6ZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcmVzdWx0cz0naGlkZScsIGZpZy5rZWVwPSdhbGwnfQpjb3VudHkxN3BvcCA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMwMTAxX0MwMV8wMDEiKSwgCiAgICAgICAgICB5ZWFyPTIwMTcsIHN0YXRlPSJOQyIsIAogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUKICByZW5hbWUoUG9wdWxhdGlvbiA9IFMwMTAxX0MwMV8wMDFFKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUKICBtdXRhdGUoCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIFBvcHVsYXRpb24pCgpjb3VudHkyMnBvcCA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMwMTAxX0MwMV8wMDEiKSwgCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIAogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUKICByZW5hbWUoUG9wdWxhdGlvbiA9IFMwMTAxX0MwMV8wMDFFKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUKICBtdXRhdGUoCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIFBvcHVsYXRpb24pCgpjb3VudHkxN3BvcCA8LSBjb3VudHkxN3BvcCAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQpjb3VudHkyMnBvcCA8LSBjb3VudHkyMnBvcCAlPiUgbXV0YXRlKHllYXIgPSAyMDIyKQoKY29tYmluZWRfeWVhcnNwb3AgPC0gYmluZF9yb3dzKGNvdW50eTE3cG9wLCBjb3VudHkyMnBvcCkKCgojIHBsb3QKZ2dwbG90KGNvbWJpbmVkX3llYXJzcG9wLCBhZXMoeCA9IE5BTUUsIHkgPSBQb3B1bGF0aW9uLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSkgKwogIGxhYnModGl0bGUgPSAiUG9wdWxhdGlvbiIsCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLAogICAgICAgeCA9ICIgIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIFBlb3BsZSIsCiAgICAgICBmaWxsID0gIlllYXIiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpKQpgYGAKCiMjIyAoMikgTWVkaWFuIEFnZQoKV2F0YXVnYSdzIG1lZGlhbiBhZ2UgaGFzIGluY3JlYXNlZCBzaGFycGx5IG92ZXIgdGhlIGxhc3QgZml2ZSB5ZWFycy4gSW4gMjAxNywgdGhlIG1lZGlhbiBhZ2Ugd2FzIDMwLjYsIHJpc2luZyAxLjUgeWVhcnMgdG8gMzIuMSBpbiAyMDIyLiBIb3dldmVyLCBXYXRhdWdhIHJlbWFpbnMgc2lnbmlmaWNhbnRseSB5b3VuZ2VyIHRoYW4gdGhlIHN1cnJvdW5kaW5nIGFyZWEsIHdoaWNoIHRlbmRzIHRvd2FyZHMgdGhlIG1pZC91cHBlciA0MHMsIGxpa2VseSBkdWUgdG8gdGhlIHN0cm9uZyBzdHVkZW50IHBvcHVsYXRpb24uCgpgYGB7ciBtZWRpYW5fYWdlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9CmNvdW50eTE3YWdlIDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiUzAxMDFfQzAxXzAzMiIpLCAKICAgICAgICAgIHllYXI9MjAxNywgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZShBZ2UgPSBTMDEwMV9DMDFfMDMyRSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lCiAgbXV0YXRlKAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBBZ2UpCgpjb3VudHkyMmFnZSA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMwMTAxX0MwMV8wMzIiKSwgCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIAogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUKICByZW5hbWUoQWdlID0gUzAxMDFfQzAxXzAzMkUpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZSgKICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgQWdlKQoKCmNvdW50eTE3YWdlIDwtIGNvdW50eTE3YWdlICU+JSBtdXRhdGUoeWVhciA9IDIwMTcpCmNvdW50eTIyYWdlIDwtIGNvdW50eTIyYWdlICU+JSBtdXRhdGUoeWVhciA9IDIwMjIpCgpjb21iaW5lZF95ZWFyc2FnZSA8LSBiaW5kX3Jvd3MoY291bnR5MTdhZ2UsIGNvdW50eTIyYWdlKQoKIyBwbG90CmdncGxvdChjb21iaW5lZF95ZWFyc2FnZSwgYWVzKHggPSBOQU1FLCB5ID0gQWdlLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSkgKwogIGxhYnModGl0bGUgPSAiTWVkaWFuIEFnZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLAogICAgICAgeCA9ICIgIiwKICAgICAgIHkgPSAiQWdlIChpbiB5ZWFycykiLAogICAgICAgZmlsbCA9ICJZZWFyIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkKYGBgCgojIyMgKDMpIEF2ZXJhZ2UgSG91c2Vob2xkIFNpemUKCkluIDIwMTcsIHRoZSBtZWRpYW4gaG91c2Vob2xkIHNpemUgaW4gV2F0YXVnYSBDb3VudHkgd2FzIDIuMzUuIERlY3JlYXNpbmcgc2xpZ2h0bHkgaW4gMjAyMiBhdCAyLjMwLCBob3VzZWhvbGQgc2l6ZSBsYXJnZWx5IG1pcnJvcnMgdGhvc2Ugb2Ygc3Vycm91bmRpbmcgY291bnRpZXMsIHdoaWNoIGFsbCBleHBlcmllbmNlIGhvdXNlaG9sZHMgb2YgYXBwcm94aW1hdGVseSAyLTMgcGVvcGxlLiBUaGlzIHN1Z2dlc3RzIHRoYXQgbWFueSBob21lcyBpbiB0aGUgYXJlYSBhcmUgZmFtaWxpZXMsIHJhdGhlciB0aGFuIGp1c3QgaW5kaXZpZHVhbHMgb3IgY291cGxlcyBsaXZpbmcgdG9nZXRoZXIuCgpgYGB7ciBob3VzZWhvbGRfc2l6ZSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQpjb3VudHlISDE3IDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiUzExMDFfQzAxXzAwMiIpLCAKICAgICAgICAgIHllYXI9MjAxNywgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZSgiSG91c2Vob2xkX1NpemUiID0gUzExMDFfQzAxXzAwMkUpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZSgKICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgIkhvdXNlaG9sZF9TaXplIikKCmNvdW50eUhIMjIgPC0gCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJTMTEwMV9DMDFfMDAyIiksIAogICAgICAgICAgeWVhcj0yMDIyLCBzdGF0ZT0iTkMiLCAKICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lCiAgcmVuYW1lKCJIb3VzZWhvbGRfU2l6ZSIgPSBTMTEwMV9DMDFfMDAyRSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lCiAgbXV0YXRlKAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCAiSG91c2Vob2xkX1NpemUiKQoKCmNvdW50eUhIMTcgPC0gY291bnR5SEgxNyAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQpjb3VudHlISDIyIDwtIGNvdW50eUhIMjIgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikKCmNvbWJpbmVkX3llYXJzSEggPC0gYmluZF9yb3dzKGNvdW50eUhIMTcsIGNvdW50eUhIMjIpCgojIHBsb3QKZ2dwbG90KGNvbWJpbmVkX3llYXJzSEgsIGFlcyh4ID0gTkFNRSwgeSA9IEhvdXNlaG9sZF9TaXplLCBmaWxsID0gZmFjdG9yKHllYXIpKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSkgKwogIGxhYnModGl0bGUgPSAiQXZlcmFnZSBIb3VzZWhvbGQgU2l6ZSIsCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLAogICAgICAgeCA9ICIgIiwKICAgICAgIHkgPSAiIyBvZiBwZW9wbGUiLAogICAgICAgZmlsbCA9ICJZZWFyIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkKCmBgYAoKIyMjICg0KSBNZWRpYW4gSW5jb21lCgpJbiAyMDIyLCBXYXRhdWdhIENvdW50eSBzYXcgYSBtZWRpYW4gaG91c2Vob2xkIGluY29tZSBvZiBcJDUwLDAzNC4gVGhpcyBpcyBvbiBwYXIgd2l0aCB0aGUgc3Vycm91bmRpbmcgY291bnRpZXMgb2YgQXNoZSwgQXZlcnksIENhbGR3ZWxsLCBhbmQgV2lsa2VzLCB3aGljaCBmZWxsIHdpdGhpbiBcJDMsMDAwIG9mIHRoaXMgcmFuZ2UuIChcJDQ5LDE3Ni1cJDUzLDMxMykuIFRoZSBjb3VudHkgZXhwZXJpZW5jZXMgcmVsYXRpdmVseSBsb3cgaW5jb21lcywgY29tcGFyZWQgdG8gdGhlIG5hdGlvbmFsIG1lZGlhbiBvZiBcJDc0LDU4MC4KCmBgYHtyIG1lZGlhbl9pbmNvbWUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KY291bnR5MTdpbmMgPC0gCiAgZ2V0X2FjcyhnZW9ncmFwaHkgPSAiY291bnR5IiwgCiAgICAgICAgICB2YXJpYWJsZXMgPSBjKCJTMTkwMV9DMDFfMDEyIiksIAogICAgICAgICAgeWVhcj0yMDE3LCBzdGF0ZT0iTkMiLCAKICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lCiAgcmVuYW1lKEluY29tZSA9IFMxOTAxX0MwMV8wMTJFKSAlPiUKICBkcGx5cjo6c2VsZWN0KC1zdGFydHNfd2l0aCgiQiIpKSAlPiUKICBtdXRhdGUoCiAgICAgICAgIE5BTUUgPSBzdHJfcmVwbGFjZShOQU1FLCAiLCBOb3J0aCBDYXJvbGluYSIsICIiKSkgJT4lCiAgZHBseXI6OmZpbHRlcihOQU1FICVpbiUgYygiQXZlcnkgQ291bnR5IiwgIldpbGtlcyBDb3VudHkiLCAiQXNoZSBDb3VudHkiLCAiV2F0YXVnYSBDb3VudHkiLCAiQ2FsZHdlbGwgQ291bnR5IikpICU+JQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIEluY29tZSkKCmNvdW50eTIyaW5jIDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiUzE5MDFfQzAxXzAxMiIpLCAKICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZShJbmNvbWUgPSBTMTkwMV9DMDFfMDEyRSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lCiAgbXV0YXRlKAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBJbmNvbWUpCgpjb3VudHkxN2luYyA8LSBjb3VudHkxN2luYyAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQpjb3VudHkyMmluYyA8LSBjb3VudHkyMmluYyAlPiUgbXV0YXRlKHllYXIgPSAyMDIyKQoKY29tYmluZWRfeWVhcnNpbmMgPC0gYmluZF9yb3dzKGNvdW50eTE3aW5jLCBjb3VudHkyMmluYykKCiMgcGxvdApnZ3Bsb3QoY29tYmluZWRfeWVhcnNpbmMsIGFlcyh4ID0gTkFNRSwgeSA9IEluY29tZSwgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIsICIjNzRjMWI5IikpICsKICBsYWJzKHRpdGxlID0gIk1lZGlhbiBJbmNvbWUiLAogICAgICAgc3VidGl0bGUgPSAiYnkgY291bnR5IiwKICAgICAgIHggPSAiICIsCiAgICAgICB5ID0gIkluY29tZSAoaW4gJCkiLAogICAgICAgZmlsbCA9ICJZZWFyIikgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSwKICAgICAgICBheGlzLnRleHQueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICJncmV5NTAiKSkKYGBgCgojIyAyLjIgSG91c2luZwoKIyMjICgxKSBIb3VzaW5nIGJ5IE9jY3VwYW5jeSBUeXBlIChPd24gdnMuIFJlbnQpCgpBcyBvZiAyMDIyLCBhcHByb3hpbWF0ZWx5IHR3by10aGlyZHMgb2YgaG9tZXMgaW4gdGhlIENvdW50eSBhcmUgb3duZXItb2NjdXBpZWQgKDYxJSkuIFdoZW4gY29uc2lkZXJlZCBhbG9uZ3NpZGUgdGhlIGxhcmdlIHlvdXRoIGFuZCBzdHVkZW50IHBvcHVsYXRpb24gYXNzb2NpYXRlZCB3aXRoIEFwcGFsYWNoaWFuIFN0YXRlLCBpdCBiZWNvbWVzIGNsZWFyZXIgdGhhdCBtb3N0IGFkdWx0cyB3aXRob3V0IGFzc29jaWF0aW9uIHRvIHRoZSB1bml2ZXJzaXR5IGFyZSBob21lb3duZXJzLgoKYGBge3IgaG91c2luZ19vY2N1cGFuY3ksIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KY291bnR5MTdvY3VwIDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiUzI1MDFfQzAxXzAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJTMjUwMV9DMDNfMDAxIiwKICAgICAgICAgICAgICAgICAgICAgICAgIlMyNTAxX0MwNV8wMDEiCiAgICAgICAgICAgICAgICAgICAgICAgICksIAogICAgICAgICAgeWVhcj0yMDE3LCBzdGF0ZT0iTkMiLCAKICAgICAgICAgIGdlb21ldHJ5PVRSVUUsIG91dHB1dD0id2lkZSIpICU+JQogIHN0X3RyYW5zZm9ybSgnRVBTRzo0MzI2JykgJT4lCiAgcmVuYW1lKFRvdGFsID0gUzI1MDFfQzAxXzAwMUUsCiAgICAgICAgT3duZXIgPSBTMjUwMV9DMDNfMDAxRSwKICAgICAgICBSZW50ZXIgPSBTMjUwMV9DMDVfMDAxRSkgJT4lCiAgZHBseXI6OnNlbGVjdCgtc3RhcnRzX3dpdGgoIkIiKSkgJT4lCiAgbXV0YXRlKAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCBUb3RhbCwgT3duZXIsIFJlbnRlcikKCmNvdW50eTIyb2N1cCA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIlMyNTAxX0MwMV8wMDEiLAogICAgICAgICAgICAgICAgICAgICAgICAiUzI1MDFfQzAzXzAwMSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJTMjUwMV9DMDVfMDAxIgogICAgICAgICAgICAgICAgICAgICAgICApLCAKICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZShUb3RhbCA9IFMyNTAxX0MwMV8wMDFFLAogICAgICAgIE93bmVyID0gUzI1MDFfQzAzXzAwMUUsCiAgICAgICAgUmVudGVyID0gUzI1MDFfQzA1XzAwMUUpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZSgKICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgVG90YWwsIE93bmVyLCBSZW50ZXIpCgpjb3VudHkxN29jdXAgPC0gY291bnR5MTdvY3VwICU+JSBtdXRhdGUoeWVhciA9IDIwMTcpCmNvdW50eTIyb2N1cCA8LSBjb3VudHkyMm9jdXAgJT4lIG11dGF0ZSh5ZWFyID0gMjAyMikKCmNvbWJpbmVkX3llYXJzb2N1cCA8LSBiaW5kX3Jvd3MoY291bnR5MTdvY3VwLCBjb3VudHkyMm9jdXApCgoKIyBwbG90CiMgbG9uZyBmb3JtYXQKY29tYmluZWRfeWVhcnNvY3VwX2xvbmcgPC0gcGl2b3RfbG9uZ2VyKGNvbWJpbmVkX3llYXJzb2N1cCwgY29scyA9IGMoUmVudGVyLCBPd25lciksIG5hbWVzX3RvID0gIk9jY3VwYW5jeSIsIHZhbHVlc190byA9ICJVbml0cyIpCgpnZ3Bsb3QoY29tYmluZWRfeWVhcnNvY3VwX2xvbmcsIGFlcyh4ID0gTkFNRSwgeSA9IFVuaXRzLCBmaWxsID0gT2NjdXBhbmN5KSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjZjliZjNlIiwgIiM3NGMxYjkiKSkgKwogIGxhYnModGl0bGUgPSAiSG91c2luZyBVbml0cyIsCiAgICAgICBzdWJ0aXRsZSA9ICJieSBvY2N1cGFuY3kgdHlwZSIsCiAgICAgICB4ID0gIiAiLAogICAgICAgeSA9ICIjIG9mIEhvdXNpbmcgVW5pdHMiLAogICAgICAgZmlsbCA9ICJPY2N1cGFuY3kiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyZXk1MCIpKQpgYGAKCiMjIyAoMikgUmVudCBCdXJkZW4KCkEgaG91c2Vob2xkIGlzIGNvbnNpZGVyZWQgcmVudCBidXJkZW5lZCBpZiB0aGV5IHNwZW5kIG1vcmUgdGhhbiAzMCUgb2YgdGhlaXIgbW9udGhseSBpbmNvbWUgb24gaG91c2luZy4gVGhpcyBtZXRyaWMgaXMga2V5IGluIGRldGVybWluaW5nIHRoZSBmaW5hbmNpYWwgaGVhbHRoIG9mIHRoZSByZXNpZGVudHMsIGFzIHdlbGwgYXMgY3VycmVudCBjb25kaXRpb25zIG9mIHRoZSBob3VzaW5nIG1hcmtldC4gTm9ydGh3ZXN0IE5vcnRoIENhcm9saW5hIGhhcyBiZWVuIHRyZW5kaW5nIGxvd2VyIGluIHJlbnQgYnVyZGVuLCB3aXRoIG1hbnkgY291bnRpZXMgc2VlaW5nIGEgZGVjcmVhc2UgaW4gYnVyZGVuIG92ZXIgdGhlIGxhc3QgZml2ZSB5ZWFycy4gSG93ZXZlciwgdGhlIHN0b3J5IGlzIGRpZmZlcmVudCB3aGVuIGl0IGNvbWVzIHRvIFdhdGF1Z2EsIHdoaWNoIGhhcyBzZWVuIGFuIHVwdGljayBpbiByZW50IGJ1cmRlbiBzaW5jZSAyMDE3LgoKQ3VycmVudGx5LCBtb3JlIHRoYW4gdHdvLXRoaXJkcyBvZiByZXNpZGVudHMgYXJlIHJlbnQgYnVyZGVuZWQsIHNpZ25hbGluZyBhbiB1bnN0YWJsZSBob3VzaW5nIG1hcmtldC4gVGhpcyBpcyBhIGtleSBpbmRpY2F0b3IgZm9yIG91ciBwcm9qZWN0J3MgdXNlIGNhc2UsIGFzIHRoZSBDb3VudHkgY29udGludWVzIHRvIHNlYXJjaCBmb3Igc29sdXRpb25zIGZvciBtYWtpbmcgaG91c2luZyBtb3JlIGFmZm9yZGFibGUgYW5kIGFjY2Vzc2libGUgZm9yIGl0cyByZXNpZGVudHMgYW5kIGZhbWlsaWVzLgoKYGBge3IgcmVudF9idXJkZW4sIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KY291bnR5MTdyZW50IDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiQjI1MDcwXzAwN0UiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOEUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOUUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMEUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMUUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDAzXzAwM0UiKSwgCiAgICAgICAgICB5ZWFyPTIwMTcsIHN0YXRlPSJOQyIsIAogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUKICByZW5hbWUoUmVudEJ1cmRlbl8zMF8zNSA9IEIyNTA3MF8wMDdFLAogICAgICAgICBSZW50QnVyZGVuXzM1XzM5ID0gQjI1MDcwXzAwOEUsCiAgICAgICAgIFJlbnRCdXJkZW5fNDBfNDkgPSBCMjUwNzBfMDA5RSwKICAgICAgICAgUmVudEJ1cmRlbl81MF85OSA9IEIyNTA3MF8wMTBFLAogICAgICAgICBSZW50QnVyZGVuXzYwX21vcmUgPSBCMjUwNzBfMDExRSwKICAgICAgICAgdG90YWxfcmVudGVyX29jY3VwaWVkID0gQjI1MDAzXzAwM0UpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZShyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgPSBSZW50QnVyZGVuXzMwXzM1ICsgUmVudEJ1cmRlbl8zNV8zOSArIFJlbnRCdXJkZW5fNDBfNDkgKyBSZW50QnVyZGVuXzUwXzk5ICsgUmVudEJ1cmRlbl82MF9tb3JlLAogICAgICAgICBQZXJjZW50X0J1cmRlbmVkID0gcm91bmQoKHJlbnRfYnVyZGVuZWRfaG91c2Vob2xkcyAvIHRvdGFsX3JlbnRlcl9vY2N1cGllZCkgKiAxMDAsIDApLAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwiQ2FsZHdlbGwgQ291bnR5IikpICU+JQogIGRwbHlyOjpzZWxlY3QoR0VPSUQsIE5BTUUsIHJlbnRfYnVyZGVuZWRfaG91c2Vob2xkcywgdG90YWxfcmVudGVyX29jY3VwaWVkLCBQZXJjZW50X0J1cmRlbmVkKQoKY291bnR5MjJyZW50IDwtIAogIGdldF9hY3MoZ2VvZ3JhcGh5ID0gImNvdW50eSIsIAogICAgICAgICAgdmFyaWFibGVzID0gYygiQjI1MDcwXzAwN0UiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOEUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAwOUUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMEUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDcwXzAxMUUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjI1MDAzXzAwM0UiKSwgCiAgICAgICAgICB5ZWFyPTIwMjIsIHN0YXRlPSJOQyIsIAogICAgICAgICAgZ2VvbWV0cnk9VFJVRSwgb3V0cHV0PSJ3aWRlIikgJT4lCiAgc3RfdHJhbnNmb3JtKCdFUFNHOjQzMjYnKSAlPiUKICByZW5hbWUoUmVudEJ1cmRlbl8zMF8zNSA9IEIyNTA3MF8wMDdFLAogICAgICAgICBSZW50QnVyZGVuXzM1XzM5ID0gQjI1MDcwXzAwOEUsCiAgICAgICAgIFJlbnRCdXJkZW5fNDBfNDkgPSBCMjUwNzBfMDA5RSwKICAgICAgICAgUmVudEJ1cmRlbl81MF85OSA9IEIyNTA3MF8wMTBFLAogICAgICAgICBSZW50QnVyZGVuXzYwX21vcmUgPSBCMjUwNzBfMDExRSwKICAgICAgICAgdG90YWxfcmVudGVyX29jY3VwaWVkID0gQjI1MDAzXzAwM0UpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZShyZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMgPSBSZW50QnVyZGVuXzMwXzM1ICsgUmVudEJ1cmRlbl8zNV8zOSArIFJlbnRCdXJkZW5fNDBfNDkgKyBSZW50QnVyZGVuXzUwXzk5ICsgUmVudEJ1cmRlbl82MF9tb3JlLAogICAgICAgICBQZXJjZW50X0J1cmRlbmVkID0gcm91bmQoKHJlbnRfYnVyZGVuZWRfaG91c2Vob2xkcyAvIHRvdGFsX3JlbnRlcl9vY2N1cGllZCkgKiAxMDAsIDApLAogICAgICAgICBOQU1FID0gc3RyX3JlcGxhY2UoTkFNRSwgIiwgTm9ydGggQ2Fyb2xpbmEiLCAiIikpICU+JQogIGRwbHlyOjpmaWx0ZXIoTkFNRSAlaW4lIGMoIkF2ZXJ5IENvdW50eSIsICJXaWxrZXMgQ291bnR5IiwgIkFzaGUgQ291bnR5IiwgIldhdGF1Z2EgQ291bnR5IiwgIkNhbGR3ZWxsIENvdW50eSIpKSAlPiUKICBkcGx5cjo6c2VsZWN0KEdFT0lELCBOQU1FLCByZW50X2J1cmRlbmVkX2hvdXNlaG9sZHMsIHRvdGFsX3JlbnRlcl9vY2N1cGllZCwgUGVyY2VudF9CdXJkZW5lZCkKCmNvdW50eTE3cmVudCA8LSBjb3VudHkxN3JlbnQgJT4lIG11dGF0ZSh5ZWFyID0gMjAxNykKY291bnR5MjJyZW50IDwtIGNvdW50eTIycmVudCAlPiUgbXV0YXRlKHllYXIgPSAyMDIyKQoKY29tYmluZWRfeWVhcnNyZW50IDwtIGJpbmRfcm93cyhjb3VudHkxN3JlbnQsIGNvdW50eTIycmVudCkKCgojIFJlc2hhcGUgdGhlIGRhdGEgaW50byBsb25nZXIgZm9ybWF0CmNvbWJpbmVkX3llYXJzcmVudF9sb25nIDwtIHBpdm90X2xvbmdlcihjb21iaW5lZF95ZWFyc3JlbnQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29scyA9IGMoUGVyY2VudF9CdXJkZW5lZCksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZXNfdG8gPSAiWWVhciIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX3RvID0gIlBlcmNlbnRhZ2UiKQoKIyBQbG90dGluZyB0aGUgZGF0YQpnZ3Bsb3QoY29tYmluZWRfeWVhcnNyZW50X2xvbmcsIGFlcyh4ID0gcmVvcmRlcihOQU1FLCAtUGVyY2VudGFnZSksIHkgPSBQZXJjZW50YWdlLCBmaWxsID0gWWVhcikpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiI2Y5YmYzZSIpLCBndWlkZSA9IEZBTFNFKSArICAjIEhpZGUgbGVnZW5kCiAgbGFicyh0aXRsZSA9ICJQZXJjZW50YWdlIG9mIFJlbnQtQnVyZGVuZWQgSG91c2Vob2xkcyIsCiAgICAgICBzdWJ0aXRsZSA9ICJieSBjb3VudHkiLAogICAgICAgeCA9ICIgIiwKICAgICAgIHkgPSAiUGVyY2VudGFnZSAoJSkiKSArCiAgdGhlbWVfbWluaW1hbCgpICsKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdCA9IDEsIHZqdXN0ID0gMSksCiAgICAgICAgYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgIGF4aXMudGV4dC55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gImdyZXk1MCIpKSAgIyBIaWRpbmcgeC1heGlzIGxhYmVsCmBgYAoKYGBge3IgcmVudF9idXJkZW5fbWFwMTcsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KZ2dwbG90KGRhdGEgPSBjb3VudHkxN3JlbnQpICsKICBnZW9tX3NmKGFlcyhmaWxsID0gUGVyY2VudF9CdXJkZW5lZCkpICsgIyBSZW1vdmVkIGNvbG9yID0gY29sb3JfcGFsZXR0ZSBoZXJlCiAgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3JzID0gY29sb3JfcGFsZXR0ZSkgKyAjIFVzZSB0aGlzIHRvIGFwcGx5IHlvdXIgY29sb3IgcGFsZXR0ZQogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBOQU1FKSwgCiAgICAgICAgICAgICAgIHNpemUgPSA0LCAjIEFkanVzdGVkIHNpemUKICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBUUlVFLAogICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKyAjIE1ha2UgdGV4dCBib2xkCiAgZ2VvbV9zZl90ZXh0KGFlcyhsYWJlbCA9IHBhc3RlMChQZXJjZW50X0J1cmRlbmVkLCAiJSIpKSwgCiAgICAgICAgICAgICAgIHNpemUgPSAzLjUsICMgQWRqdXN0ZWQgc2l6ZQogICAgICAgICAgICAgICBjb2xvdXIgPSAiYmxhY2siLCAKICAgICAgICAgICAgICAgY2hlY2tfb3ZlcmxhcCA9IFRSVUUsIAogICAgICAgICAgICAgICBudWRnZV95ID0gLTAuMDUsCiAgICAgICAgICAgICAgIGZvbnRmYWNlID0gImJvbGQiKSArICMgTWFrZSB0ZXh0IGJvbGQKICBsYWJzKHRpdGxlID0gIlJlbnQgQnVyZGVuZWQgSG91c2Vob2xkcyBieSBDb3VudHkiLAogICAgICAgc3VidGl0bGUgPSAiWWVhcjogMjAxNyIsCiAgICAgICBmaWxsID0gIlBlcmNlbnQgQnVyZGVuZWQiKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKQpgYGAKCmBgYHtyIHJlbnRfYnVyZGVuX21hcDIyLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9CmdncGxvdChkYXRhID0gY291bnR5MjJyZW50KSArCiAgZ2VvbV9zZihhZXMoZmlsbCA9IFBlcmNlbnRfQnVyZGVuZWQpKSArICMgUmVtb3ZlZCBjb2xvciA9IGNvbG9yX3BhbGV0dGUgaGVyZQogIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG9ycyA9IGNvbG9yX3BhbGV0dGUpICsgIyBVc2UgdGhpcyB0byBhcHBseSB5b3VyIGNvbG9yIHBhbGV0dGUKICBnZW9tX3NmX3RleHQoYWVzKGxhYmVsID0gTkFNRSksIAogICAgICAgICAgICAgICBzaXplID0gNCwgIyBBZGp1c3RlZCBzaXplCiAgICAgICAgICAgICAgIGNvbG91ciA9ICJibGFjayIsIAogICAgICAgICAgICAgICBjaGVja19vdmVybGFwID0gVFJVRSwKICAgICAgICAgICAgICAgZm9udGZhY2UgPSAiYm9sZCIpICsgIyBNYWtlIHRleHQgYm9sZAogIGdlb21fc2ZfdGV4dChhZXMobGFiZWwgPSBwYXN0ZTAoUGVyY2VudF9CdXJkZW5lZCwgIiUiKSksIAogICAgICAgICAgICAgICBzaXplID0gMy41LCAjIEFkanVzdGVkIHNpemUKICAgICAgICAgICAgICAgY29sb3VyID0gImJsYWNrIiwgCiAgICAgICAgICAgICAgIGNoZWNrX292ZXJsYXAgPSBUUlVFLCAKICAgICAgICAgICAgICAgbnVkZ2VfeSA9IC0wLjA1LAogICAgICAgICAgICAgICBmb250ZmFjZSA9ICJib2xkIikgKyAjIE1ha2UgdGV4dCBib2xkCiAgbGFicyh0aXRsZSA9ICJSZW50IEJ1cmRlbmVkIEhvdXNlaG9sZHMgYnkgQ291bnR5IiwKICAgICAgIHN1YnRpdGxlID0gIlllYXI6IDIwMjIiLAogICAgICAgZmlsbCA9ICJQZXJjZW50IEJ1cmRlbmVkIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikKYGBgCgojIyMgKDMpIEhvdXNlIFByaWNlIC8gT3duZXJzaGlwIEJ1cmRlbgoKVGhlIG1lZGlhbiBob3VzZSB2YWx1ZSBpcyBcJDI4MywwMDAsIHdoaWNoIGlzIHJvdWdobHkgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIG5hdGlvbndpZGUgYXZlcmFnZSBwcm9wZXJ0eSB2YWx1ZS4gVGhlIG93bmVyc2hpcCBhZmZvcmRhYmlsaXR5IGltcHJvdmVkIGluIHRoZSBwYXN0IGZpdmUgeWVhcnMsIGFzIDE0LjQlIG9mIHRoZSBvd25lcnNoaXAgaG91c2VzIGFyZSBub3QgYWZmb3JkYWJsZSwgd2hpY2ggZGVjcmVhc2VkIGZyb20gMTUuNiUgaW4gMjAxNy4gVGhlIG93bmVyc2hpcCBhZmZvcmRhYmlsaXR5IGlzIGFsc28gYmV0dGVyIHRoYW4gdGhlIG5hdGlvbmFsIGF2ZXJhZ2UsIHdoaWNoIGlzIDE2LjglLgoKIyMjICg0KSBTdHVkZW50IFBvcHVsYXRpb24KCldpdGhpbiBXYXRhdWdhIENvdW50eSBzaXRzIEFwcGFsYWNoaWFuIFN0YXRlIFVuaXZlcnNpdHksIGEgcHVibGljIGZvdXIteWVhciB1bml2ZXJzaXR5IHRoYXQgc2VydmVzIG92ZXIgMTgsMDAwIHN0dWRlbnRzLiBUaGUgc3VyZ2Ugb2Ygc3R1ZGVudCBwb3B1bGF0aW9ucyBpcyBmZWx0IHRocm91Z2hvdXQgQm9vbmUgYW5kIHN1cnJvdW5kaW5nIGFyZWFzLCBhbmQgcGxheXMgYSBsYXJnZSByb2xlIGluIHRoZSBDb3VudHkncyBlY29ub215LiBBcyBvZiAyMDIyLCBhcm91bmQgMzAlIG9mIFdhdGF1Z2EncyBwb3B1bGF0aW9uIHdhcyBjb2xsZWdlIHN0dWRlbnRzLCBhIHNsaWdodCBpbmNyZWFzZSBpbiB0aGUgbGFzdCBmaXZlIHllYXJzLiBXaGVuIHBsYW5uaW5nIGZvciBleGlzdGluZyBhbmQgZnV0dXJlIGhvdXNpbmcgbmVlZHMsIHRoZSBIb3VzaW5nIENvdW5jaWwgc2hvdWxkIGNvbnNpZGVyIHRoZSBzdHVkZW50IHBvcHVsYXRpb24sIGFzIHdlbGwgYXMgaG91c2luZyB0aGF0IGNhbiBjb250aW51ZSB0byBwcm92aWRlIGFzIGdyYWR1YXRlcyBzZXR0bGUgZWxzZXdoZXJlIGluIHRoZSBDb3VudHkgYW5kIGZpbmQgam9icy4KCiMjIyAoNSkgTnVtYmVyIG9mIEhvdXNlaG9sZHMgYnkgVmVoaWNsZXMgT3duZWQKCldhdGF1Z2EgaXMgbGFyZ2VseSBhIGNhci1kb21pbmF0ZWQgY29tbXVuaXR5LCB3aXRoIG5lYXJseSBldmVyeSBob3VzZWhvbGQgb3duaW5nIGF0IGxlYXN0IG9uZSBjYXIuIEluIGZhY3QsIGFjY29yZGluZyB0byB0aGUgQ2Vuc3VzLCBhYm91dCAxNCwwMDAgaG91c2Vob2xkcyBoYXZlIDIgb3IgbW9yZSwgc3VnZ2VzdGluZyB0aGF0IGFsbW9zdCBldmVyeSBhZHVsdCBpbiB0aGUgY291bnR5IGhhcyBhY2Nlc3MgdG8gdGhlaXIgb3duIGNhciwgYW5kIG1heSBub3QgbmVlZCB0byBzaGFyZSB3aXRoIGEgc3BvdXNlIG9yIG90aGVyIGhvdXNlbWF0ZS4gTW9iaWxpdHkgaGFiaXRzIGNhbiBiZSBhc2NlcnRhaW5lZCwgc3VjaCBhcyB0aGUgbmVlZCB0byB0cmF2ZWwgZmFyIGRpc3RhbmNlcyBmb3IgZGFpbHkgdHJpcHMgc3VjaCBhcyB0aGUgY29tbXV0ZSB0byB3b3JrIG9yIHRvIGdldCBncm9jZXJpZXMuCgpgYGB7ciB2ZWhpY2xlc19vd25lZCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnfQpjb3VudHkxNyA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIkIwODIwMV8wMDIiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCMDgyMDFfMDA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIkIwODIwMV8wMDUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNiIpLCAKICAgICAgICAgIHllYXI9MjAxNywgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZSgiTm8gVmVoaWNsZSIgPSBCMDgyMDFfMDAyRSwKICAgICAgICAgIjEgVmVoaWNsZSIgPSBCMDgyMDFfMDAzRSwKICAgICAgICAgIjIgVmVoaWNsZXMiID0gQjA4MjAxXzAwNEUsCiAgICAgICAgICIzIFZlaGljbGVzIiA9IEIwODIwMV8wMDVFLAogICAgICAgICAiNCsgVmVoaWNsZXMiID0gQjA4MjAxXzAwNkUpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZSgKICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgIk5vIFZlaGljbGUiLCAiMSBWZWhpY2xlIiwgIjIgVmVoaWNsZXMiLCAiMyBWZWhpY2xlcyIsICI0KyBWZWhpY2xlcyIpCgpjb3VudHkyMiA8LSAKICBnZXRfYWNzKGdlb2dyYXBoeSA9ICJjb3VudHkiLCAKICAgICAgICAgIHZhcmlhYmxlcyA9IGMoIkIwODIwMV8wMDIiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwMyIsCiAgICAgICAgICAgICAgICAgICAgICAgICJCMDgyMDFfMDA0IiwKICAgICAgICAgICAgICAgICAgICAgICAgIkIwODIwMV8wMDUiLAogICAgICAgICAgICAgICAgICAgICAgICAiQjA4MjAxXzAwNiIpLCAKICAgICAgICAgIHllYXI9MjAyMiwgc3RhdGU9Ik5DIiwgCiAgICAgICAgICBnZW9tZXRyeT1UUlVFLCBvdXRwdXQ9IndpZGUiKSAlPiUKICBzdF90cmFuc2Zvcm0oJ0VQU0c6NDMyNicpICU+JQogIHJlbmFtZSgiTm8gVmVoaWNsZSIgPSBCMDgyMDFfMDAyRSwKICAgICAgICAgIjEgVmVoaWNsZSIgPSBCMDgyMDFfMDAzRSwKICAgICAgICAgIjIgVmVoaWNsZXMiID0gQjA4MjAxXzAwNEUsCiAgICAgICAgICIzIFZlaGljbGVzIiA9IEIwODIwMV8wMDVFLAogICAgICAgICAiNCsgVmVoaWNsZXMiID0gQjA4MjAxXzAwNkUpICU+JQogIGRwbHlyOjpzZWxlY3QoLXN0YXJ0c193aXRoKCJCIikpICU+JQogIG11dGF0ZSgKICAgICAgICAgTkFNRSA9IHN0cl9yZXBsYWNlKE5BTUUsICIsIE5vcnRoIENhcm9saW5hIiwgIiIpKSAlPiUKICBkcGx5cjo6ZmlsdGVyKE5BTUUgJWluJSBjKCJBdmVyeSBDb3VudHkiLCAiV2lsa2VzIENvdW50eSIsICJBc2hlIENvdW50eSIsICJXYXRhdWdhIENvdW50eSIsICJDYWxkd2VsbCBDb3VudHkiKSkgJT4lCiAgZHBseXI6OnNlbGVjdChHRU9JRCwgTkFNRSwgIk5vIFZlaGljbGUiLCAiMSBWZWhpY2xlIiwgIjIgVmVoaWNsZXMiLCAiMyBWZWhpY2xlcyIsICI0KyBWZWhpY2xlcyIpCgpjb3VudHkxNyA8LSBjb3VudHkxNyAlPiUgbXV0YXRlKHllYXIgPSAyMDE3KQpjb3VudHkyMiA8LSBjb3VudHkyMiAlPiUgbXV0YXRlKHllYXIgPSAyMDIyKQoKY29tYmluZWRfeWVhcnMgPC0gYmluZF9yb3dzKGNvdW50eTE3LCBjb3VudHkyMikKCiMgU3Vic2V0IGRhdGEgZm9yIFdhdGF1Z2EgQ291bnR5CndhdGF1Z2FfZGF0YSA8LSBjb21iaW5lZF95ZWFycyAlPiUKICBmaWx0ZXIoTkFNRSA9PSAiV2F0YXVnYSBDb3VudHkiKQoKIyBNZWx0IHRoZSBkYXRhc2V0IHRvIGxvbmcgZm9ybWF0CndhdGF1Z2FfZGF0YV9sb25nIDwtIG1lbHQod2F0YXVnYV9kYXRhLCBpZC52YXJzID0gYygieWVhciIsICJOQU1FIiwgIkdFT0lEIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmFycyA9IGMoIk5vIFZlaGljbGUiLCAiMSBWZWhpY2xlIiwgIjIgVmVoaWNsZXMiLCAiMyBWZWhpY2xlcyIsICI0KyBWZWhpY2xlcyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlLm5hbWUgPSAiVmVoaWNsZV9DYXRlZ29yeSIsIHZhbHVlLm5hbWUgPSAiSG91c2Vob2xkcyIpCgojIFBsb3QgaGlzdG9ncmFtCmdncGxvdCh3YXRhdWdhX2RhdGFfbG9uZywgYWVzKHggPSBWZWhpY2xlX0NhdGVnb3J5LCB5ID0gSG91c2Vob2xkcywgZmlsbCA9IGZhY3Rvcih5ZWFyKSkpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IiwgcG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgbGFicyh0aXRsZSA9ICJOdW1iZXIgb2YgSG91c2Vob2xkcyBieSBWZWhpY2xlcyBPd25lZCIsCiAgICAgICBzdWJ0aXRsZSA9ICJZZWFyczogMjAxNyBhbmQgMjAyMiIgLAogICAgICAgeCA9ICIgIiwKICAgICAgIHkgPSAiTnVtYmVyIG9mIEhvdXNlaG9sZHMiLAogICAgICAgZmlsbCA9ICJZZWFyIikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNmOWJmM2UiLCAiIzc0YzFiOSIpLCBsYWJlbHMgPSBjKCIyMDE3IiwgIjIwMjIiKSkgKwogIHRoZW1lX21pbmltYWwoKSArCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSA0NSwgaGp1c3QgPSAxKSkKYGBgCgojIyAyLjMgRGVwZW5kZW50IFZhcmlhYmxlIC0gU2VwdGljIFBlcm1pdAoKV2UgdXNlZCB0aGUgbnVtYmVyIG9mIG5ldyBzZXB0aWMgcGVybWl0cyB3aXRoaW4gZWFjaCBwYXJjZWwgYXMgb3VyIG1vZGVsJ3MgZGVwZW5kZW50IHZhcmlhYmxlLiBXYXRhdWdhIENvdW50eSBhcHByb3ZlZCAzMDAgbmV3IHNlcHRpYyBwZXJtaXRzIGluIDIwMTcuIFRoZSBudW1iZXIgaW5jcmVhc2VkIHRvIDQ3MiBpbiAyMDIyLiBUaGUgZGF0YSBpbmRpY2F0ZXMgYSA1Ny4zMyUgaW5jcmVhc2UgaW4gdGhlIG51bWJlciBvZiBzZXB0aWMgcGVybWl0cyBvdmVyIHRoZSBmaXZlLXllYXIgcGVyaW9kLiBUaGUgbnVtYmVyIG9mIHNlcHRpYyBwZXJtaXRzIGlzIGEgY3JpdGljYWwgaW5kaWNhdG9yIG9mIGRldmVsb3BtZW50IGFuZCBsYW5kIHVzZSBjaGFuZ2UuIFRoZSBpbmNyZWFzZSBpbiBzZXB0aWMgcGVybWl0cyBzdWdnZXN0cyBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIG5ldyBkZXZlbG9wbWVudCBhbmQgbGFuZCB1c2UgY2hhbmdlIGluIFdhdGF1Z2EgQ291bnR5IG92ZXIgdGhlIHBhc3QgZml2ZSB5ZWFycy4KCmBgYHtyIHJlYWRfcGVybWl0X2RhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmJvdW5kYXJ5IDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9Cb3VuZGFyeS5nZW9qc29uIikKcGFyY2VsIDwtIHN0X3JlYWQoImh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS91Yz9leHBvcnQ9ZG93bmxvYWQmaWQ9MXo0SEQwRjJHSExCazZLS1libjhBQllYZVp4RUZLMkFKIikKcGVybWl0XzE3IDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9jbGlwcGVkX3Blcm1pdDE3Lmdlb2pzb24iKQpwZXJtaXRfMjIgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL2NsaXBwZWRfcGVybWl0MjIuZ2VvanNvbiIpCmBgYAoKYGBge3IgdHJhbnNmZXJfY3JzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIHRyYW5zZmVyIHRoZSBjcnMgb2YgcGVybWl0XzE3IGFuZCBwZXJtaXRfMjIgdG8gdGhlIHNhbWUgY29vcmRpbmF0ZSBzeXN0ZW0gYXMgYm91bmRhcnkgYW5kIHBhcmNlbApwZXJtaXRfMTcgPC0gc3RfdHJhbnNmb3JtKHBlcm1pdF8xNywgc3RfY3JzKHBhcmNlbCkpCnBlcm1pdF8yMiA8LSBzdF90cmFuc2Zvcm0ocGVybWl0XzIyLCBzdF9jcnMocGFyY2VsKSkKYGBgCgpgYGB7ciBwbG90X3Blcm1pdHMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KCiNjKCIjZTJhMzM0IiwgIiNmOWJmM2UiLCAiI2ZjZDk3NyIsICIjOWFkN2QyIiwgIiM3NGMxYjkiKQoKcGxvdF9wZXJtaXQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IHBhcmNlbCwgY29sb3IgPSAiZ3JleTkwIiwgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIHNpemUgPSAwLjIpICsKICBnZW9tX3NmKGRhdGEgPSBib3VuZGFyeSwgY29sb3IgPSAiI2NmODkwZSIsIGZpbGwgPSAidHJhbnNwYXJlbnQiLCBzaG93LmxlZ2VuZCA9IEZBTFNFKSArCiAgZ2VvbV9zZihkYXRhID0gcGVybWl0XzE3LCBhZXMoY29sb3IgPSAiUGVybWl0IDE3IiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNywgc2hvdy5sZWdlbmQgPSAicG9pbnQiKSArCiAgZ2VvbV9zZihkYXRhID0gcGVybWl0XzIyLCBhZXMoY29sb3IgPSAiUGVybWl0IDIyIiksIHNpemUgPSAxLCBhbHBoYSA9IDAuNywgc2hvdy5sZWdlbmQgPSAicG9pbnQiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGVybWl0cyIsIAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJQZXJtaXQgMTciID0gIiNlMmEzMzQiLCAiUGVybWl0IDIyIiA9ICIjNzRjMWI5IiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIjIwMTciLCAiMjAyMiIpKSArCiAgdGhlbWVfdm9pZCgpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAicmlnaHQiKSArCiAgbGFicyh0aXRsZSA9ICJXYXRhdWdhIFNlcHRpYyBQZXJtaXRzIiwKICAgICAgIHN1YnRpdGxlID0gIlllYXJzOiAyMDE3IGFuZCAyMDIyIikgKwogIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgc2l6ZSA9IDE3KSwgCiAgICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTApKSAKCnBsb3RfcGVybWl0CgojIFNhdmUgdGhlIHBsb3QgYXMgYSBoaWdoLXJlc29sdXRpb24gaW1hZ2UKI2dnc2F2ZSgicGxvdF9wZXJtaXRfMjIucG5nIiwgcGxvdF8yMiwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgZHBpID0gMzAwKQpgYGAKCiMjIDIuNCBQaHlzaWNhbCBGZWF0dXJlcwoKIyMjICgxKSBMYW5kIENvdmVyCgojIyMjIChhKSBMYW5kIENvdmVyIC0gMjAyMSAobGF0ZXN0IGRhdGEpIHsudGFic2V0fQoKVGhlIFdhdGF1Z2EgQ291bnR5IDIwMjEgbGFuZCBjb3ZlciB1bmRlcnNjb3JlcyB0aGUgY291bnR5J3MgcmljaCBuYXR1cmFsIHJlc291cmNlcyBhbmQgbW9kZXJhdGUgdXJiYW4gZGV2ZWxvcG1lbnQuIFRoZSB0b3RhbCBsYW5kIGNvdmVyIGFyZWEgaXMgcHJlZG9taW5hbnRseSBmb3Jlc3RlZCBsYW5kICg3NC41NiUpLCB3aXRoIDU0LjE2JSBvZiB0aGUgY291bnR5J3MgbGFuZCBjb3ZlciBhcmVhIGJlaW5nIGRlY2lkdW91cyBmb3Jlc3QgYW5kIDE5LjIlIG1peGVkIGZvcmVzdCwgYW5kIDEuMiUgZXZlcmdyZWVuIGZvcmVzdC4gRGV2ZWxvcGVkIGFyZWFzLCB3aGljaCBpcyBsaW1pdGVkIHRvIGFib3V0IDEzLjg5JSBvZiB0aGUgdG90YWwgbGFuZCBjb3ZlciBhcmVhIGlzIG1hZGUgdXAgb2YgMTEuMjMlIG9mIGRldmVsb3BlZCBvcGVuIHNwYWNlLCAxLjQ4JSBkZXZlbG9wZWQgbG93IGludGVuc2l0eSwgMC45JSBkZXZlbG9wZWQgbWVkaXVtIGRlbnNpdHksIDAuMjglIGRldmVsb3BlZCBoaWdoIGludGVuc2l0eS4gVGhlIG1ham9yaXR5IG9mIGRldmVsb3BtZW50IGlzIGNsYXNzaWZpZWQgYXMgb3BlbiBzcGFjZSwgd2hpY2ggY291bGQgZW5jb21wYXNzIHBhcmtzLCBnb2xmIGNvdXJzZXMsIG9yIGFncmljdWx0dXJhbCBsYW5kIHRoYXQgYWRkcyB0byB0aGUgcnVyYWwgY2hhcmFjdGVyIG9mIHRoZSBjb3VudHkuIFRoZSBpbmNyZW1lbnRhbGx5IHNtYWxsZXIgcGVyY2VudGFnZXMgZm9yIGxvdywgbWVkaXVtLCBhbmQgaGlnaC1pbnRlbnNpdHkgZGV2ZWxvcG1lbnRzIGluZGljYXRlIGNvbmNlbnRyYXRlZCB1cmJhbml6YXRpb24gYXJvdW5kIGNpdGllcyBhbmQgdHJhbnNwb3J0YXRpb24gY29ycmlkb3JzLCByZWZsZWN0aW5nIHN0cmF0ZWdpYyBsYW5kIHVzZSBwbGFubmluZyB0aGF0IHByZXNlcnZlcyB0aGUgbmF0dXJhbCBsYW5kc2NhcGUgd2hpbGUgYWNjb21tb2RhdGluZyByZXNpZGVudGlhbCBhbmQgY29tbWVyY2lhbCBuZWVkcy4KCmBgYHtyIHJlYWRfbHVsY19kYXRhLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKc2V0d2QKZmlyZV9kaXN0cmljdHMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL0ZpcmVEaXN0cmljdHNfRmVhdHVyZXNUb0pTT04uZ2VvanNvbiIpCm1hbmFnZWRfYXJlYXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL21hbmFnZWRfYXJlYXNUb0pTT04uZ2VvanNvbiIpCm5hdHVyYWxfYXJlYXMgPC0gc3RfcmVhZCgiaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9HZW9KU09OL05hdHVyYWxfYXJlYV9KU09OLmdlb2pzb24iKQp6b25lZF9hcmVhcyA8LSBzdF9yZWFkKCJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0dlb0pTT04vem9uZWRhcmVhc19GZWF0dXJlc1RvSlNPTi5nZW9qc29uIikKbXVuaWNpcGFsX2JvdW5kIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9OQ0RPVF9NdW5pY2lwYWxfQm91bmRhcmllcy5nZW9qc29uIikKY291bnR5X2JvdW5kIDwtIHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vR2VvSlNPTi9OQ0RPVF9Db3VudHlfQm91bmRhcmllcy5nZW9qc29uIikKCgpsZWdlbmQgPC0gcGFsX25sY2QoKQpwYXRoIDwtICIvVXNlcnMvYWxpY2UvRG9jdW1lbnRzL0dpdEh1Yi9NdXNhXzgwMV9XYXRhdWdhL0RhdGEvTGFuZHVzZV9SYXN0ZXIvIgoKCiNvdXRwdXQgdGhlIHJhc3RlcnMgaW4gdGlmZiAocHJlcHJvY2VzcyBpbiBBcmNHSVMgLSBzbyBpdCdzIG9uZSBmaWxlKTogS2F0aGxlZW4KbGNfMjAyMSA8LSByYXN0ZXIocGFzdGUwKHBhdGgsICJsdWxjXzIwMjEiKSkKbGNfMjAxOSA8LSByYXN0ZXIocGFzdGUwKHBhdGgsICJsdWxjXzIwMTkiKSkKbGNfMjAxNiA8LSByYXN0ZXIocGFzdGUwKHBhdGgsICJsdWxjXzIwMTYiKSkKbGNfMjAxMyA8LSByYXN0ZXIocGFzdGUwKHBhdGgsICJsdWxjXzIwMTMiKSkKbGNfMjAxMSA8LSByYXN0ZXIocGFzdGUwKHBhdGgsICJsdWxjXzIwMTEiKSkKCmBgYAoKYGBge3IgbGNfMjAyMSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgZmlnLmFsaWduPSdsZWZ0J30KcyA8LSBzdGFjayhsY18yMDExLCBsY18yMDEzLCBsY18yMDE2LGxjXzIwMTksIGxjXzIwMjEgKQoKdmFscyA8LXVuaXF1ZShzW1s1XV0pICAjIEdldCB1bmlxdWUgdmFsdWVzIGZyb20gbGNfMjAyMQpkZiA8LSBsZWdlbmRbbGVnZW5kJElEICVpbiUgdmFscyxdICAjIEZpbHRlciBsZWdlbmQgaW5mb3JtYXRpb24gYmFzZWQgb24gbGNfMjAyMSB2YWx1ZXMKcmF0NSA8LSByYXRpZnkobGNfMjAyMSkKCm15S2V5IDwtIGxpc3QoCiAgcmVjdGFuZ2xlcyA9IGxpc3QoY29sID0gZGYkQ29sb3IpLAogIHRleHQgPSBsaXN0KGxhYiA9IGRmJENsYXNzKSwKICBzcGFjZSA9ICdyaWdodCcsCiAgY29sdW1ucyA9IDEsCiAgc2l6ZSA9IDIsCiAgY2V4ID0gLjYKKQoKbGV2ZWxwbG90KHJhdDUsIGF0dD0nSUQnLCAKICAgICAgICAgIGNvbC5yZWdpb25zPWRmJENvbG9yLAogICAgICAgICAgbWF4cGl4ZWxzPW5jZWxsKHJhdDUpLCAjIFRyeSBzZXR0aW5nIG1heHBpeGVscyB0byB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoZSByYXN0ZXIKICAgICAgICAgIHBhci5zZXR0aW5ncyA9IGxpc3QoCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIAogICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKSwgCiAgICAgICAgICAgIHN0cmlwLmJvcmRlciA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JykKICAgICAgICAgICksIAogICAgICAgICAgc2NhbGVzID0gbGlzdChjb2wgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICAgIGNvbG9ya2V5ID0gRkFMU0UsCiAgICAgICAgICBrZXkgPSBteUtleSwKICAgICAgICAgIG1haW4gPSAiV2F0YXVnYSAyMDIxIExhbmQgQ292ZXIiKSAjIFRpdGxlIGFkZGVkIGhlcmUKCmBgYAoKIyMjIyAoYikgTGFuZCBDb3ZlciAtIENoYW5nZXMgT3ZlciAxMCBZZWFycyB7LnRhYnNldH0KCkZyb20gMjAxMSBhbmQgMjAyMSBXYXRhdWdhIENvdW50eSB3aXRuZXNzZWQgYSBub3RhYmxlIHNoaWZ0IGluIGxhbmQgY292ZXIsIHBhcnRpY3VsYXJseSBpbiB0ZXJtcyBvZiBkZXZlbG9wbWVudCBhbmQgdGhlIHJlZHVjdGlvbiBvZiBuYXR1cmFsIGxhbmRzY2FwZXMgbGlrZSBncmFzc2xhbmRzIGFuZCBzaHJ1YiBsYW5kcy4gVGhlIGRhdGEgaW5kaWNhdGVzIGEgMTMuODklIGluY3JlYXNlIGluIGRldmVsb3BlZCBhcmVhcywgd2l0aCBzaWduaWZpY2FudCBncm93dGggaW4gbG93LCBtZWRpdW0sIGFuZCBoaWdoLWludGVuc2l0eSBkZXZlbG9wbWVudHMuIE1vc3Qgbm90YWJseSwgbWVkaXVtIGludGVuc2l0eSBkZXZlbG9wbWVudCBzYXcgYSBzaWduaWZpY2FudCBpbmNyZWFzZSBvZiAxNy4yMiUgaW4gMjAyMS4gQ29uY3VycmVudGx5LCB0aGUgY291bnR5IGV4cGVyaWVuY2VkIGEgZHJhbWF0aWMgNTYuNSUgZGVjcmVhc2UgaW4gR3Jhc3NsYW5kL0hlcmJhY2VvdXMgYXJlYXMgYW5kIGEgNTAlIHJlZHVjdGlvbiBpbiBTaHJ1Yi9TY3J1YiBsYW5kLiBUaGVzZSBjaGFuZ2VzIGNvdWxkIGJlIGF0dHJpYnV0ZWQgdG8gc2V2ZXJhbCBmYWN0b3JzLCBpbmNsdWRpbmcgdGhlIGNvbnZlcnNpb24gb2Ygb3BlbiBmaWVsZHMgYW5kIGdyYXNzbGFuZHMgaW50byBkZXZlbG9wZWQgbGFuZCBvciBwb3NzaWJseSBpbnRvIGFncmljdWx0dXJhbCB1c2UuIFRoZSBtYWpvcml0eSBvZiB0aGUgbGFuZCBjb3ZlciByZW1haW5zIG5hdHVyYWwgb3Igc2VtaS1uYXR1cmFsLCB3aXRoIGRldmVsb3BlZCBvcGVuIHNwYWNlcyBhbHNvIGV4cGVyaWVuY2luZyBhIHNtYWxsIHJpc2UuIFRoZSBkYXRhIHN1Z2dlc3RzIGEgY2FyZWZ1bCBiYWxhbmNlIGJldHdlZW4gZGV2ZWxvcG1lbnQgYW5kIHRoZSBtYWludGVuYW5jZSBvZiBuYXR1cmFsIGxhbmQgY292ZXJzIG92ZXIgdGhlIHBhc3QgZGVjYWRlLgoKIyMjIyMgMjAxMS0yMDIxIHsudW5udW1iZXJlZH0KCmBgYHtyIGxjX3RpbWVfc2VyaWVzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp5ZWFycy5saXN0IDwtIGxpc3QoIjIwMTEiLCAiMjAxMyIsICIyMDE2IiwgIjIwMTkiLCAiMjAyMSIpCgoKc2F2ZUdJRih7CiAgZm9yKGkgaW4gMTpubGF5ZXJzKHMpKXsKICAgIHJhdCA8LSByYXRpZnkoc1tbaV1dKQogICAgcGxvdCA8LSBsZXZlbHBsb3QocmF0LCBhdHQ9J0lEJywKICAgICAgICAgICAgICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQpLAogICAgICAgICAgICAgICAgICAgICAgY29sLnJlZ2lvbnM9ZGYkQ29sb3IsCiAgICAgICAgICAgICAgICAgICAgICBwYXIuc2V0dGluZ3MgPSBsaXN0KGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlwLmJvcmRlciA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JykpLCAKICAgICAgICAgICAgICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksCiAgICAgICAgICAgICAgICAgICAgICBtYWluPXBhc3RlMCgiV2F0YXVnYSBDb3VudHkgbGFuZCBjb3ZlciAiLCB5ZWFycy5saXN0W1tpXV0pLAogICAgICAgICAgICAgICAgICAgICAgY29sb3JrZXk9RkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBrZXkgPSBteUtleSkgIyBJbmNsdWRlIHRoZSBrZXkgaW4geW91ciBwbG90CiAgICBwcmludChwbG90KQogIH0KfSwgaW50ZXJ2YWw9MSwgbW92aWUubmFtZT0ibGNfdGltZV9zZXJpZXMuZ2lmIiwgYW5pLndpZHRoPTkwMCwgYW5pLmhlaWdodD02MDApCmBgYAoKIVtdKEM6L1VzZXJzL2ZhdGJvL09uZURyaXZlL0RvY3VtZW50cy9HaXRIdWIvTXVzYV84MDFfV2F0YXVnYS9EYXRhL2xjX3RpbWVfc2VyaWVzLmdpZikgCgojIyMjIyAyMDExIHsudW5udW1iZXJlZH0KCmBgYHtyIGxjXzIwMTEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGZpZy53aWR0aD0gMTAsIGZpZy5oZWlnaHQ9MTB9CnJhdCA8LSByYXRpZnkobGNfMjAxMSkKCm15S2V5IDwtIGxpc3QoCiAgcmVjdGFuZ2xlcyA9IGxpc3QoY29sID0gZGYkQ29sb3IpLAogIHRleHQgPSBsaXN0KGxhYiA9IGRmJENsYXNzKSwKICBzcGFjZSA9ICdyaWdodCcsCiAgY29sdW1ucyA9IDEsCiAgc2l6ZSA9IDIsCiAgY2V4ID0gLjYKKQpsZXZlbHBsb3QocmF0LCBhdHQ9J0lEJywgCiAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwKICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQpLCAjIFRyeSBzZXR0aW5nIG1heHBpeGVscyB0byB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoZSByYXN0ZXIKICAgICAgICAgIHBhci5zZXR0aW5ncyA9IGxpc3QoCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIAogICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKSwgCiAgICAgICAgICAgIHN0cmlwLmJvcmRlciA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JykKICAgICAgICAgICksIAogICAgICAgICAgc2NhbGVzID0gbGlzdChjb2wgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICAgIGNvbG9ya2V5ID0gRkFMU0UsCiAgICAgICAgICBrZXkgPSBteUtleSwKICAgICAgICAgIG1haW4gPSAiV2F0YXVnYSAyMDExIExhbmQgQ292ZXIiKSAjIFRpdGxlIGFkZGVkIGhlcmUKYGBgCgojIyMjIyAyMDEzIHsudW5udW1iZXJlZH0KCmBgYHtyIGxjXzIwMTMsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnJhdDIgPC0gcmF0aWZ5KGxjXzIwMTMpCgpsZXZlbHBsb3QocmF0MiwgYXR0PSdJRCcsIAogICAgICAgICAgY29sLnJlZ2lvbnM9ZGYkQ29sb3IsCiAgICAgICAgICBtYXhwaXhlbHM9bmNlbGwocmF0MiksICMgVHJ5IHNldHRpbmcgbWF4cGl4ZWxzIHRvIHRoZSBudW1iZXIgb2YgY2VsbHMgaW4gdGhlIHJhc3RlcgogICAgICAgICAgcGFyLnNldHRpbmdzID0gbGlzdCgKICAgICAgICAgICAgYXhpcy5saW5lID0gbGlzdChjb2wgPSAidHJhbnNwYXJlbnQiKSwgCiAgICAgICAgICAgIHN0cmlwLmJhY2tncm91bmQgPSBsaXN0KGNvbCA9ICd0cmFuc3BhcmVudCcpLCAKICAgICAgICAgICAgc3RyaXAuYm9yZGVyID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKQogICAgICAgICAgKSwgCiAgICAgICAgICBzY2FsZXMgPSBsaXN0KGNvbCA9ICJ0cmFuc3BhcmVudCIpLAogICAgICAgICAgY29sb3JrZXkgPSBGQUxTRSwKICAgICAgICAgIGtleSA9IG15S2V5LAogICAgICAgICAgbWFpbiA9ICJXYXRhdWdhIDIwMTMgTGFuZCBDb3ZlciIpICMgVGl0bGUgYWRkZWQgaGVyZQpgYGAKCiMjIyMjIDIwMTYgey51bm51bWJlcmVkfQoKYGBge3IgbGNfMjAxNiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmF0MyA8LSByYXRpZnkobGNfMjAxNikKCmxldmVscGxvdChyYXQzLCBhdHQ9J0lEJywgCiAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwKICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQzKSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyCiAgICAgICAgICBwYXIuc2V0dGluZ3MgPSBsaXN0KAogICAgICAgICAgICBheGlzLmxpbmUgPSBsaXN0KGNvbCA9ICJ0cmFuc3BhcmVudCIpLCAKICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIAogICAgICAgICAgICBzdHJpcC5ib3JkZXIgPSBsaXN0KGNvbCA9ICd0cmFuc3BhcmVudCcpCiAgICAgICAgICApLCAKICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksCiAgICAgICAgICBjb2xvcmtleSA9IEZBTFNFLAogICAgICAgICAga2V5ID0gbXlLZXksCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAxNiBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlCmBgYAoKIyMjIyMgMjAxOSB7LnVubnVtYmVyZWR9CgpgYGB7ciBsY18yMDE5LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpyYXQ0IDwtIHJhdGlmeShsY18yMDE5KQoKbGV2ZWxwbG90KHJhdDQsIGF0dD0nSUQnLCAKICAgICAgICAgIGNvbC5yZWdpb25zPWRmJENvbG9yLAogICAgICAgICAgbWF4cGl4ZWxzPW5jZWxsKHJhdDQpLCAjIFRyeSBzZXR0aW5nIG1heHBpeGVscyB0byB0aGUgbnVtYmVyIG9mIGNlbGxzIGluIHRoZSByYXN0ZXIKICAgICAgICAgIHBhci5zZXR0aW5ncyA9IGxpc3QoCiAgICAgICAgICAgIGF4aXMubGluZSA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksIAogICAgICAgICAgICBzdHJpcC5iYWNrZ3JvdW5kID0gbGlzdChjb2wgPSAndHJhbnNwYXJlbnQnKSwgCiAgICAgICAgICAgIHN0cmlwLmJvcmRlciA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JykKICAgICAgICAgICksIAogICAgICAgICAgc2NhbGVzID0gbGlzdChjb2wgPSAidHJhbnNwYXJlbnQiKSwKICAgICAgICAgIGNvbG9ya2V5ID0gRkFMU0UsCiAgICAgICAgICBrZXkgPSBteUtleSwKICAgICAgICAgIG1haW4gPSAiV2F0YXVnYSAyMDE5IExhbmQgQ292ZXIiKSAjIFRpdGxlIGFkZGVkIGhlcmUKYGBgCgojIyMjIyAyMDIxIHsudW5udW1iZXJlZH0KCmBgYHtyIGxjXzIwMjFfMiwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KdmFscyA8LXVuaXF1ZShzW1s1XV0pICAjIEdldCB1bmlxdWUgdmFsdWVzIGZyb20gbGNfMjAyMQpkZiA8LSBsZWdlbmRbbGVnZW5kJElEICVpbiUgdmFscyxdICAjIEZpbHRlciBsZWdlbmQgaW5mb3JtYXRpb24gYmFzZWQgb24gbGNfMjAyMSB2YWx1ZXMKcmF0NSA8LSByYXRpZnkobGNfMjAyMSkKCmxldmVscGxvdChyYXQ1LCBhdHQ9J0lEJywgCiAgICAgICAgICBjb2wucmVnaW9ucz1kZiRDb2xvciwKICAgICAgICAgIG1heHBpeGVscz1uY2VsbChyYXQ1KSwgIyBUcnkgc2V0dGluZyBtYXhwaXhlbHMgdG8gdGhlIG51bWJlciBvZiBjZWxscyBpbiB0aGUgcmFzdGVyCiAgICAgICAgICBwYXIuc2V0dGluZ3MgPSBsaXN0KAogICAgICAgICAgICBheGlzLmxpbmUgPSBsaXN0KGNvbCA9ICJ0cmFuc3BhcmVudCIpLCAKICAgICAgICAgICAgc3RyaXAuYmFja2dyb3VuZCA9IGxpc3QoY29sID0gJ3RyYW5zcGFyZW50JyksIAogICAgICAgICAgICBzdHJpcC5ib3JkZXIgPSBsaXN0KGNvbCA9ICd0cmFuc3BhcmVudCcpCiAgICAgICAgICApLCAKICAgICAgICAgIHNjYWxlcyA9IGxpc3QoY29sID0gInRyYW5zcGFyZW50IiksCiAgICAgICAgICBjb2xvcmtleSA9IEZBTFNFLAogICAgICAgICAga2V5ID0gbXlLZXksCiAgICAgICAgICBtYWluID0gIldhdGF1Z2EgMjAyMSBMYW5kIENvdmVyIikgIyBUaXRsZSBhZGRlZCBoZXJlCgpgYGAKCmBgYHtyIGxjX3RvX3RhYmxlLCBjYWNoZT1UUlVFLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQoKeWVhcnM8LWMoMjAxMSwgMjAxMywgMjAxNiwgMjAxOSwgMjAyMSkKCmQ8LWRmCmZvciAoaSBpbiAxOmxlbmd0aCh5ZWFycykpIHsKICBkPC1tZXJnZShkLCBmcmVxKHNbW2ldXSksIGJ5Lng9IklEIiAsYnkueT0idmFsdWUiLCBhbGwueT1GLCBhbGwueD1UKQogIG5hbWVzKGQpW25jb2woZCldPC1wYXN0ZTAoInBpeF8iLCB5ZWFyc1tbaV1dKQogIH0KCgpkJHNxdWFyZS5taWxlLmNoYW5nZTwtKGQkcGl4XzIwMjEgLSBkJHBpeF8yMDExKSAqIDMwICogMzAgKiAwLjAwMDAwMDM4NjEwCmQkcGVyY2VudGNoYW5nZTwtKGQkcGl4XzIwMjEgLSBkJHBpeF8yMDExKS9kJHBpeF8yMDExCmQkcHJvcDIwMjE8LWQkcGl4XzIwMjEvc3VtKGQkcGl4XzIwMjEpCgpkJHBlcmNlbnRjaGFuZ2UuMjAxMS4yMDIxPC1wYXN0ZShyb3VuZCgxMDAqZCRwZXJjZW50Y2hhbmdlLCAyKSwgIiUiLCBzZXA9IiIpCmQkcGVyY2VudC5hcmVhLjIwMjE8LXBhc3RlKHJvdW5kKDEwMCpkJHByb3AyMDIxLCAyKSwgIiUiLCBzZXA9IiIpCgprYWJsZShkWyxjKDIsMTAsMTMsMTQpXSkgICU+JQogIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiksIGZ1bGxfd2lkdGggPSBGKQpgYGAKCiMjIyAoMikgU2xvcGUKCkFzIGEgbW91bnRhaW5vdXMgYXJlYSwgdGhlIG5ldyBkZXZlbG9wbWVudHMgaGlnaGx5IGRlcGVuZCBvbiB0aGUgdG9wb2dyYXBoeS4gVGhlIHNsb3BlIGlzIGEgY3JpdGljYWwgZmFjdG9yIGluIGRldGVybWluaW5nIHRoZSBmZWFzaWJpbGl0eSBvZiBkZXZlbG9wbWVudC4gVGhlIHN0ZWVwZXIgdGhlIHNsb3BlLCB0aGUgbW9yZSBjaGFsbGVuZ2luZyBpdCBpcyB0byBkZXZlbG9wLiBXZSB1c2VkIHRoZSBzbG9wZSBkYXRhIHRvIGlkZW50aWZ5IHRoZSBhcmVhcyB3aXRoIHN0ZWVwIHNsb3Blcywgd2hpY2ggYXJlIGxlc3MgbGlrZWx5IHRvIGJlIGRldmVsb3BlZC4KCgpgYGB7ciByZWFkX3Nsb3BlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuYWxpZ249J2xlZnQnfQpwYXRoXzEgPC0gIi9Vc2Vycy9hbGljZS9Eb2N1bWVudHMvR2l0SHViL011c2FfODAxX1dhdGF1Z2EvRGF0YS9zbG9wZV9yYXN0ZXIvIgoKc2xvcGUgPC0gcmFzdGVyKHBhc3RlMChwYXRoXzEsIlNsb3BlLnRpZiIpKQoKCiMgU2V0IHVwIHBhciBzZXR0aW5ncyBmb3Igbm8gYmFja2dyb3VuZCBvciBtYXJnaW5zCgpwbG90KHNsb3BlLCBheGVzID0gRkFMU0UsIGJveCA9IEZBTFNFLCBtYWluID0gIlNsb3BlIEFuZ2xlIikKCiMgU2F2ZSB0aGUgcGxvdCB0byBhIFBORyBmaWxlIHdpdGggaGlnaCByZXNvbHV0aW9uCnN1cHByZXNzTWVzc2FnZXMoe2Rldi5jb3B5KHBuZywgZmlsZW5hbWUgPSAic2xvcGVfcGxvdC5wbmciKQpkZXYub2ZmKCl9KQoKCmBgYAoKYFxuYEFzIDY1JSjiiYgzMy4wMsKwKSBpcyB0aGUgbWF4aW11bSBzbG9wZSBzdWl0YWJsZSBmb3IgZGV2ZWxvcG1lbnQsIHdlIHdpbGwgdXNlIDI1wrAgYXMgYSB0aHJlc2hvbGQgdG8gaWRlbnRpZnkgdGhlIGFyZWFzIHVuc3VpdGFibGUgZm9yIGRldmVsb3BtZW50cy5UaGUgcGxvdCBiZWxvdyBzaG93cyB0aCByZWNsYXNzaWZpZWQgc2xvcGUgZGVncmVlIGluIHRoZSBjb3VudHkuIFRoZSBncmVlbiBhcmVhcyBhcmUgc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LCB3aGlsZSB0aGUgd2hpdGUgYXJlYXMgYXJlIHVuc3VpdGFibGUgZm9yIGRldmVsb3BtZW50LgoKYGBge3IgcmVjX3Nsb3BlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBmaWcuYWxpZ249J2xlZnQnfQpyZWNfc2xvcGUgPC0gcmFzdGVyKHBhc3RlMChwYXRoXzEsICJyZWNfc2xvcGUyNS50aWYiKSkKCnBsb3QocmVjX3Nsb3BlLCBheGVzID0gRkFMU0UsIGJveCA9IEZBTFNFLAogICAgIG1haW4gPSAiU3VpdGFiaWxpdHkgZm9yIERldmVsb3BtZW50IGJ5IFNsb3BlIikKCiMgU2F2ZSB0aGUgcGxvdCB0byBhIFBORyBmaWxlIHdpdGggaGlnaCByZXNvbHV0aW9uCnN1cHByZXNzTWVzc2FnZXMoe2Rldi5jb3B5KHBuZywgZmlsZW5hbWUgPSAicmVjX3Nsb3BlX3Bsb3QucG5nIikKZGV2Lm9mZigpfSkKCmBgYAoKIyMjICgzKSBEaXN0YW5jZSB0byBMYW5kc2xpZGUKCkxhbmRzbGlkZXMgcG9zZSB0aGUgcHJpbWFyeSBoYXphcmQgaW4gV2F0YXVnYSBDb3VudHksIGFuZCB0aGUgc2FmZXR5IG9mIGVhY2ggcGFyY2VsIGNvcnJlbGF0ZXMgd2l0aCBpdHMgZGlzdGFuY2UgZnJvbSBsYW5kc2xpZGUtcHJvbmUgYXJlYXMuIElsbHVzdHJhdGVkIGluIHRoZSBwcm92aWRlZCBmaWd1cmUsIHRoZSBub3J0aGVhc3Rlcm4gcmVnaW9uIG9mIFdhdGF1Z2EgZW1lcmdlcyBhcyB0aGUgc2FmZXN0IHpvbmUuIFRoaXMgc2FmZXR5IGlzIHBhcnRseSBhdHRyaWJ1dGFibGUgdG8gdGhlIGdlbnRsZSBzbG9wZSBjaGFyYWN0ZXJpc3RpYyBvZiB0aGlzIHBhcnRpY3VsYXIgYXJlYS4KCk5vdGU6IFRoZSB3aGl0ZSBsaW5lcyBpbiB0aGUgcGxvdHMgcmVwcmVzZW50IGdhcHMgYmV0d2VlbiB0aGUgcGFyY2Vscy4gVGhleSBvZnRlbiBjb3JyZWxhdGUgd2l0aCBzdHJlYW1zIG9yIHJvYWRzLgoKYGBge3IgbG9hZF9uYXR1cmFsX2RhdGEsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmxhbmRzbGlkZSA9IHN0X3JlYWQoImh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL2xhbmRzbGlkZS5nZW9qc29uIikKCndhdGVyc3VwcGx5ID0gc3RfcmVhZCgnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL0phcnJlZEVSYW5kYWxsL011c2FfODAxX1dhdGF1Z2EvbWFpbi9EYXRhL25hdHVyYWwvd2F0ZXJfc3VwcGx5Lmdlb2pzb24nKQoKbGluZSA9IHN0X3JlYWQoJ2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9KYXJyZWRFUmFuZGFsbC9NdXNhXzgwMV9XYXRhdWdhL21haW4vRGF0YS9uYXR1cmFsL2xpbmUuZ2VvanNvbicpCmBgYAoKYGBge3IgcGFyY2VsX2NlbnRyb2lkLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIENhbGN1bGF0ZSB0aGUgY2VudHJvaWQgb2YgZWFjaCBwYXJjZWwKcGFyY2VsX2NlbnRyb2lkcyA8LSBzdF9jZW50cm9pZChwYXJjZWwpCmBgYAoKYGBge3IgcGFyY2VsX2Rpc3RhbmNlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpkaXN0YW5jZSA9IHBhcmNlbAoKIyBBZGQgYSBjb2x1bW4gbmFtZWQgJ2NlbnRyb2lkX2dlb21ldHJ5JyB0byB0aGUgcGFyY2VsIGRhdGFzZXQKZGlzdGFuY2UkY2VudHJvaWRfZ2VvbWV0cnkgPC0gcGFyY2VsX2NlbnRyb2lkcwpgYGAKCmBgYHtyIGxhbmRzbGlkZV9nZW9tZXRyeSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KbGFuZHNsaWRlX2dlb21ldHJ5IDwtIHN0X2dlb21ldHJ5KGxhbmRzbGlkZSkKCiMgQ29udmVydCB0aGUgZ2VvbWV0cnkgdG8gYSBkYXRhIGZyYW1lCmxhbmRzbGlkZV9kZiA8LSBhcy5kYXRhLmZyYW1lKGxhbmRzbGlkZV9nZW9tZXRyeSkKYGBgCgpgYGB7ciBkaXN0YW5jZV90ZXN0LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpzdF9jIDwtIHN0X2Nvb3JkaW5hdGVzCnN0X2NvaWQgPC0gc3RfY2VudHJvaWQKCnRlc3QxPC1zdF9jKHN0X2NvaWQocGFyY2VsKSkKdGVzdDI8LSBzdF9jKHN0X2NvaWQobGFuZHNsaWRlKSkKdGVzdDMgPC0gc3RfYyhzdF9jb2lkKHdhdGVyc3VwcGx5KSkKCmZpbmFsIDwtIHBhcmNlbCAlPiUKICAgIG11dGF0ZSgKICAgICAgbGFuZHNsaWRlLm5uID0KICAgICAgICBubl9mdW5jdGlvbih0ZXN0MSwgdGVzdDIsaz0yKSwKICAgICAgd2F0ZXJzaGVkLm5uID0gCiAgICAgICAgbm5fZnVuY3Rpb24odGVzdDEsIHRlc3QzLCBrID0gMSkpCmBgYAoKYGBge3Igc2F2ZV9sYW5kc2xpZGUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnBsb3RfbGFuZHNsaWRlIDwtZ2dwbG90KCkgKwogICAgICBnZW9tX3NmKGRhdGEgPSBmaW5hbCwgYWVzKGZpbGw9bGFuZHNsaWRlLm5uKSwgY29sb3VyPU5BKSArCiAgI2dlb21fc2YoZGF0YSA9IHBhcmNlbCwgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMC4wMDUpICsgICMgQWRqdXN0IHRoZSBzaXplIGhlcmUKICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWU9IkRpc3RhbmNlIikgKwogICAgICBsYWJzKHRpdGxlPSJEaXN0YW5jZSB0byB0aGUgVHdvIE5lYXJlc3QgTGFuZHNsaWRlIFBvaW50cyIpICsKICAgICAgdGhlbWVfdm9pZCgpIAoKcGxvdF9sYW5kc2xpZGUKCiNnZ3NhdmUoImxhbmRzbGlkZS5qcGciLCBwbG90X2xhbmRzbGlkZSwgZHBpID0gMzAwKQpgYGAKCiMjIyAoNCkgRGlzdGFuY2UgdG8gV2F0ZXJzaGVkCgpXYXRlciBzdXBwbHkgcGxheXMgYSBjcnVjaWFsIHJvbGUgaW4gV2F0YXVnYSBDb3VudHkncyBsYW5kc2NhcGUuIEdpdmVuIHRoZSBwb3RlbnRpYWwgZW52aXJvbm1lbnRhbCByYW1pZmljYXRpb25zLCBpdCdzIGltcGVyYXRpdmUgdG8gbWFpbnRhaW4gYSBzYWZlIGRpc3RhbmNlIGJldHdlZW4gdGhlIHNlcHRpYyBzeXN0ZW1zIGFuZCB0aGUgd2F0ZXIgc3VwcGx5IGFyZWFzLiBUaHJvdWdoIGNvbXByZWhlbnNpdmUgYW5hbHlzaXMsIGl0J3MgZXZpZGVudCB0aGF0IHRoZSBtaWRkbGUgcmVnaW9uIG9mIFdhdGF1Z2EgQ291bnR5IGlzIGFkamFjZW50IHRvIHRoZXNlIGNyaXRpY2FsIHdhdGVyIHN1cHBseSB6b25lcy4gQ29uc2VxdWVudGx5LCB3aGVuIGluc3RhbGxpbmcgc2VwdGljIHN5c3RlbXMgaW4gdGhpcyBhcmVhLCBjYXJlZnVsIGF0dGVudGlvbiBtdXN0IGJlIHBhaWQgdG8gbWl0aWdhdGluZyBlbnZpcm9ubWVudGFsIHJpc2tzIGFuZCBwcmV2ZW50aW5nIHdhdGVyIHBvbGx1dGlvbi4KCk5vdGU6IFRoZSB3aGl0ZSBsaW5lcyBpbiB0aGUgcGxvdHMgcmVwcmVzZW50IGdhcHMgYmV0d2VlbiB0aGUgcGFyY2Vscy4gVGhleSBvZnRlbiBjb3JyZWxhdGUgd2l0aCBzdHJlYW1zIG9yIHJvYWRzLgoKYGBge3IgcGxvdF9kaXN0YW5jZV93YXRlcnNoZWQsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcGxvdF93YXRlcnNoZWQgPC1nZ3Bsb3QoKSArCiAgICAgIGdlb21fc2YoZGF0YSA9IGZpbmFsLCBhZXMoZmlsbD13YXRlcnNoZWQubm4pLCBjb2xvdXI9TkEpICsKICAjZ2VvbV9zZihkYXRhID0gcGFyY2VsLCBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gInJlZCIsIHNpemUgPSAwLjAwNSkgKyAgIyBBZGp1c3QgdGhlIHNpemUgaGVyZQogICAgICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZT0iRGlzdGFuY2UiKSArCiAgICAgIGxhYnModGl0bGU9IkRpc3RhbmNlIHRvIHRoZSBOZWFyZXN0IFdhdGVyc2hlZCIpICsKICAgICAgdGhlbWVfdm9pZCgpIAoKcGxvdF93YXRlcnNoZWQKCiNnZ3NhdmUoIndhdGVyc3VwcGx5LmpwZyIsIHBsb3Rfd2F0ZXJzaGVkLCBkcGkgPSAzMDApCmBgYAoKIyMjICg1KSBEaXN0YW5jZSB0byBOZWFyZXN0IFJvYWQKCkFjY2Vzc2liaWxpdHkgdG8gdHJhbnNwb3J0YXRpb24gaW5mcmFzdHJ1Y3R1cmUgc2lnbmlmaWNhbnRseSBpbmZsdWVuY2VzIHRoZSBkZXZlbG9wbWVudCBwb3RlbnRpYWwgb2YgYSBwYXJjZWwuIFR5cGljYWxseSwgcHJveGltaXR5IHRvIHRoZSByb2FkIG5ldHdvcmsgZGlyZWN0bHkgY29ycmVsYXRlcyB3aXRoIGhpZ2hlciBhY2Nlc3NpYmlsaXR5LiBIb3dldmVyLCB0aGUgZ3JhcGhpYyByZXZlYWxzIGNlcnRhaW4gcGFyY2VscyBsYWNraW5nIGFkZXF1YXRlIGFjY2VzcyB0byByb2FkcywgaW5kaWNhdGluZyBwb3RlbnRpYWwgbGltaXRhdGlvbnMgaW4gdGhlaXIgZGV2ZWxvcG1lbnQgdmFsdWUuIFRocm91Z2ggdGhlIGFuYWx5c2lzIHdlIGNhbiBzZWUgdGhhdCBzb3V0aC13ZXN0IGFuZCBub3J0aC1lYXN0IFdhdGF1Z2EgYXJlIGxlc3MgY29ubmVjdGVkLgoKTm90ZTogVGhlIHdoaXRlIGxpbmVzIGluIHRoZSBwbG90cyByZXByZXNlbnQgZ2FwcyBiZXR3ZWVuIHRoZSBwYXJjZWxzLiBUaGV5IG9mdGVuIGNvcnJlbGF0ZSB3aXRoIHN0cmVhbXMgb3Igcm9hZHMuCgpgYGB7ciBsaW5lX2Rpc3RhbmNlLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpsaW5lIDwtIGxpbmUgJT4lCiAgICAgICAgICAgICAgIHJlbmFtZShEaXN0X1JvYWQgPSBgUm9hZF9EaXN0YCkKbGluZTIgPC0gc3RfdHJhbnNmb3JtKGxpbmUsIHN0X2NycyhmaW5hbCkpCmNvbWJpbmVkX2RmIDwtIGNiaW5kKGZpbmFsLCBsaW5lMikKYGBgCgpgYGB7ciBwbG90X2Rpc3RhbmNlX3JvYWQsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJ30KcGxvdF9yb2FkIDwtZ2dwbG90KCkgKwogICAgICBnZW9tX3NmKGRhdGEgPSBjb21iaW5lZF9kZiwgYWVzKGZpbGw9RGlzdF9Sb2FkKSwgY29sb3VyPU5BKSArCiAgI2dlb21fc2YoZGF0YSA9IHBhcmNlbCwgZmlsbCA9ICJ0cmFuc3BhcmVudCIsIGNvbG91ciA9ICJyZWQiLCBzaXplID0gMC4wMDUpICsgICMgQWRqdXN0IHRoZSBzaXplIGhlcmUKICAgICAgc2NhbGVfZmlsbF92aXJpZGlzKG5hbWU9IkRpc3RhbmNlIikgKwogICAgICBsYWJzKHRpdGxlPSJEaXN0YW5jZSB0byB0aGUgTmVhcmVzdCBSb2FkIikgKwogICAgICB0aGVtZV92b2lkKCkgCgpwbG90X3JvYWQKCiNnZ3NhdmUoInJvYWQuanBnIiwgcGxvdF9yb2FkLCBkcGkgPSAzMDApCmBgYAoKIyMjICg2KSBEaXN0YW5jZSB0byBOZWFyZXN0IFdhdGVyIEJvZHkKClRoZSBwcmVzZW5jZSBvZiB3YXRlciBib2RpZXMgaXMgaW50ZWdyYWwgdG8gb3VyIGV2YWx1YXRpb24gZnJhbWV3b3JrLiBUaGV5IHNpZ25pZmljYW50bHkgaW5mbHVlbmNlIHRoZSB3YXRlciB0YWJsZSwgY29uc2VxdWVudGx5IGFmZmVjdGluZyB0aGUgZGVzaWduIGFuZCBwbGFjZW1lbnQgb2Ygc2VwdGljIHN5c3RlbXMuIFdhdGF1Z2EgQ291bnR5IGJvYXN0cyBhIGRlbnNlIG5ldHdvcmsgb2Ygd2F0ZXJ3YXlzLiBEZXNwaXRlIHRoaXMsIHdlIHByaW9yaXRpemUgY2FsY3VsYXRpbmcgdGhlIGRpc3RhbmNlIGZyb20gdGhlIGNlbnRlciBvZiBtYXNzIHRvIHRoZSBuZWFyZXN0IHJpdmVyIGluIG91ciBhc3Nlc3NtZW50cy4gT3ZlcmFsbCwgdGhlIHZhcmlhbmNlIGluIHByb3hpbWl0eSB0byB3YXRlciBib2RpZXMgYW1vbmcgcGFyY2VscyBpcyBtaW5pbWFsLgoKTm90ZTogVGhlIHdoaXRlIGxpbmVzIGluIHRoZSBwbG90cyByZXByZXNlbnQgZ2FwcyBiZXR3ZWVuIHRoZSBwYXJjZWxzLiBUaGV5IG9mdGVuIGNvcnJlbGF0ZSB3aXRoIHN0cmVhbXMgb3Igcm9hZHMuCgpgYGB7ciBwbG90X2Rpc3RhbmNlX3dhdGVyYm9keSwgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpwbG90X3dhdGVyYm9keSA8LWdncGxvdCgpICsKICAgICAgZ2VvbV9zZihkYXRhID0gY29tYmluZWRfZGYsIGFlcyhmaWxsPURpc3RfRmxvd2xpbmUpLCBjb2xvdXI9TkEpICsKICAjZ2VvbV9zZihkYXRhID0gcGFyY2VsLCBmaWxsID0gInRyYW5zcGFyZW50IiwgY29sb3VyID0gInJlZCIsIHNpemUgPSAwLjAwNSkgKyAgIyBBZGp1c3QgdGhlIHNpemUgaGVyZQogICAgICBzY2FsZV9maWxsX3ZpcmlkaXMobmFtZT0iV2F0ZXIgRGlzdGFuY2UiKSArCiAgICAgIGxhYnModGl0bGU9IkRpc3RhbmNlIHRvIHRoZSBOZWFyZXN0IFdhdGVyYm9keSIpICsKICAgICAgdGhlbWVfdm9pZCgpCgpwbG90X3dhdGVyYm9keQoKI2dnc2F2ZSgid2F0ZXJib2R5LmpwZyIsIHBsb3Rfd2F0ZXJib2R5LCBkcGkgPSAzMDApCmBgYAoKIyMjICg3KSBTb2lsCgpUaGVyZSBhcmUgb3ZlciA4MCB0eXBlcyBvZiBzb2lsIGluIFdhdGF1Z2EgY291bnR5LiBUaGUgc29pbCB0eXBlIGlzIGltcG9ydGFudCBmb3IgdGhlIHNlcHRpYyBzeXN0ZW0gZGVzaWduIGFuZCBpbnN0YWxsYXRpb24uIFRoZSBzb2lsIHR5cGUgd2lsbCBhbHNvIGFmZmVjdCB0aGUgd2F0ZXIgYWJzb3JwdGlvbiByYXRlIGFuZCB0aGUgZGVwdGggb2YgdGhlIHNlcHRpYyBzeXN0ZW0uIEFmdGVyIHNlYXJjaGVkIG9uIHRoZSBzb2lsIGRhdGFiYXNlIG9mIFVTREEgKFVuaXRlZCBTdGF0ZXMgRGVwYXJ0bWVudCBvZiBBZ3JpY3VsdHVyZSkgd2Vic2l0ZSwgd2UgZm91bmQgdGhhdCB0aGUgc29pbCB0eXBlIGlzIGNsYXNzaWZpZWQgYnkgdGhlIE1VU1lNIChNYXAgVW5pdCBTeW1ib2wpIGNvbHVtbi4gV2UgYWdncmVnYXRlZCB0aGUgc29pbCB0eXBlIGludG8gMyBtYWluIGNhdGVnb3JpZXMgYmFzZWQgb24gdGhlIGRyYWluYWdlIGFiaWxpdHkgYW5kIHBlcm1lYWJpbGl0eSBvZiB0aGUgc29pbC4gVGhlIDMgY2F0ZWdvcmllcyBhcmUgQS1Nb2RlcmF0ZWx5IFJhcGlkIEluZmlsdHJhdGlvbiBSYXRlLCBCLU1vZGVyYXRlIEluZmlsdHJhdGlvbiBSYXRlLCBDLUxvdyBJbmZpbHRyYXRpb24gUmF0ZS4gVGhlIEMgdHlwZSBsb3ctaW5maWx0cmF0aW9uIHJhdGUgYW5kIHdlbGwtZHJhaW5lZCBzb2lsIGlzIHRoZSBiZXN0IGZvciBzZXB0aWMgc3lzdGVtIGluc3RhbGxhdGlvbiwgYW5kIHRoZSBwb29ybHkgZHJhaW5lZCBzb2lsIGlzIHRoZSB3b3JzdC4KCmBgYHtyIHJlYWRfc29pbCwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0Kc29pbCA8LSBzdF9yZWFkKCdodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vSmFycmVkRVJhbmRhbGwvTXVzYV84MDFfV2F0YXVnYS9tYWluL0RhdGEvbmF0dXJhbC9zb2lsX3R5cGUuZ2VvanNvbicpCnNvaWwgPC0gc3RfdHJhbnNmb3JtKHNvaWwsIHN0X2NycyhwYXJjZWwpKQpgYGAKCmBgYHtyfQpjb2xvcl9wYWxldHRlMiA8LSBjKCIjZTJhMzM0IiwiI2YxZWM5OWZmIiwgIiM5YWQ3ZDJmZiIsICIjM2U3MDY3ZmYiLCAiI2NmZDllMGZmIikKYGBgCgpgYGB7ciBwbG90X3NvaWwsIGVjaG89RkFMU0UsIGZpZy5zaG93PSdob2xkJywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBTaG93IGEgbWFwIGJhc2VkIG9uIGNvbHVtbiBNVVNZTSwgc2hvdyB1bmlxdWUgdmFsdWUKCnBsb3Rfc29pbCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gc29pbCwgYWVzKGZpbGwgPSBDYXRlZ29yeSksIGNvbG9yID0gInRyYW5zcGFyZW50IikgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiU29pbCBUeXBlIiwgdmFsdWVzID0gY29sb3JfcGFsZXR0ZTIsIG5hLnZhbHVlID0gIndoaXRlIikgKyAjIFVzZSBjdXN0b20gY29sb3IgcGFsZXR0ZQogIGxhYnModGl0bGU9IlNvaWwgSW5maWx0cmF0aW9uIExldmVsIikgKwogIHRoZW1lX3ZvaWQoKQoKcGxvdF9zb2lsCgojIFNhdmUgdGhlIHBsb3QgYXMgYSBoaWdoLXJlc29sdXRpb24gaW1hZ2UKI2dnc2F2ZSgicGxvdF9zb2lsLnBuZyIsIHBsb3Rfc29pbCwgd2lkdGggPSAxMCwgaGVpZ2h0ID0gOCwgZHBpID0gMzAwKQpgYGAKCiMjIyAoOCkgTmF0dXJhbCBBcmVhCgpXYXRhdWdhIENvdW50eSBpcyBob21lIHRvIG51bWVyb3VzIHNpdGVzIGRlc2lnbmF0ZWQgYXMgbmF0dXJhbCBoZXJpdGFnZSBhcmVhcyBvciBzaWduaWZpY2FudCBuYXR1cmFsIGFyZWFzLCByZWNvZ25pemVkIGF0IG5hdGlvbmFsLCBzdGF0ZSwgcmVnaW9uYWwsIG9yIGNvdW50eSBsZXZlbHMuIFRoZXNlIGFyZWFzLCBwcm90ZWN0ZWQgdGhyb3VnaCBvd25lcnNoaXAgYnkgZmVkZXJhbCBvciBzdGF0ZSBlbnRpdGllcyBvciBoZWxkIGluIHByaXZhdGUgaGFuZHMsIHNlcnZlIGFzIGNyaXRpY2FsIGhhYml0YXRzIGZvciBiaW9kaXZlcnNpdHksIGN1bHR1cmFsIGhlcml0YWdlIHNpdGVzLCBvciBuYXR1cmFsIHJlc291cmNlcy4gVW5kZXJzdGFuZGluZyB0aGUgcHJlY2lzZSBsb2NhdGlvbnMgb2YgdGhlc2UgcHJvdGVjdGVkIHNpdGVzIGlzIGVzc2VudGlhbCBmb3IgaWRlbnRpZnlpbmcgcGFyY2VscyBzdWl0YWJsZSBmb3IgZGV2ZWxvcG1lbnQgd2hpbGUgZW5zdXJpbmcgY29uc2VydmF0aW9uIGVmZm9ydHMgYXJlIHJlc3BlY3RlZC4KCmBgYHtyIHBsb3RfbmF0dXJhbF9hcmVhX293bmVyLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCd9CmdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBib3VuZGFyeSwgZmlsbCA9IE5BLCBjb2xvciA9ICJibGFjayIpICsgCiAgZ2VvbV9zZihkYXRhID0gbWFuYWdlZF9hcmVhcywgYWVzKGZpbGwgPSBPV05FUl9UWVBFKSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjb2xvcl9wYWxldHRlKSArIAogIGxhYnModGl0bGUgPSAiV2F0YXVnYSBNYW5hZ2VkIEFyZWFzIGJ5IE93bmVyIFR5cGUiLAogICAgICAgc3VidGl0bGUgPSAiWWVhcjogMjAyMiIsCiAgICAgICBjb2xvciA9ICJPd25lciBUeXBlIikgKwogIHRoZW1lX3ZvaWQoKQpgYGAKCmBgYHtyIHBsb3RfbmF0dXJhbF9hcmVhX3JhdGluZywgZWNobz1GQUxTRSwgZmlnLnNob3c9J2hvbGQnLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gYm91bmRhcnksIGZpbGwgPSBOQSwgY29sb3IgPSAiYmxhY2siKSArIAogIGdlb21fc2YoZGF0YSA9IG5hdHVyYWxfYXJlYXMsIGFlcyhmaWxsID0gQ19SQVRJTkcpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGNvbG9yX3BhbGV0dGUpICsgCiAgbGFicyh0aXRsZSA9ICJXYXRhdWdhIE5hdHVyYWwgUmF0aW5nIiwKICAgICAgIHN1YnRpdGxlID0gIlllYXI6IDIwMjIiLAogICAgICAgY29sb3IgPSAiUmF0aW5nIikgKwogIHRoZW1lX3ZvaWQoKQoKYGBgCgojIyAyLjUgRWNvbm9taWMgRmVhdHVyZXMKCiMjIyAoMSkgUHJvcGVydHkgVmFsdWUKClByb3BlcnR5IHZhbHVlIGlzIGEgY3JpdGljYWwgZmFjdG9yIGluIGRldGVybWluaW5nIHRoZSBkZXZlbG9wbWVudCBwb3RlbnRpYWwgb2YgYSBwYXJjZWwuIEl0IGlzIGEgZGlyZWN0IHJlZmxlY3Rpb24gb2YgdGhlIG1hcmtldCBkZW1hbmQgYW5kIHRoZSBwb3RlbnRpYWwgcmV0dXJuIG9uIGludmVzdG1lbnQuIFRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIHRoZSBzYWxlIHByaWNlIG9mIHRoZSBwcm9wZXJ0eS4gVGhlIGhpZ2hlciB0aGUgcHJvcGVydHkgdmFsdWUsIHRoZSBoaWdoZXIgdGhlIGRldmVsb3BtZW50IHBvdGVudGlhbC4KCmBgYHtyIHJlYWRfcHJvcGVydHlfdmFsdWUsIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CnByb3BlcnR5X3ZhbHVlIDwtIHN0X3JlYWQoImh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS91Yz9leHBvcnQ9ZG93bmxvYWQmaWQ9MTZXSWNEa053WFQ1YVByOTJtU1k4TmFmZkQyazZtMGU3IikKcHJvcGVydHlfdmFsdWUgPC0gc3RfdHJhbnNmb3JtKHByb3BlcnR5X3ZhbHVlLCBzdF9jcnMocGFyY2VsKSkKYGBgCgpgYGB7ciBwbG90X3Byb3BlcnR5X3ZhbHVlLCBlY2hvPUZBTFNFLCBmaWcuc2hvdz0naG9sZCcsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgU2hvdyBhIGNobG9yb3BsZXRoIG1hcCBvZiBwcm9wZXJ0eSB2YWx1ZSwgYmFzZWQgb24gdGhlIHZhbHVlIG9mIGNvbHVtbiAnU0FMRVBSSUNFJwpwbG90X3ZhbHVlIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBwcm9wZXJ0eV92YWx1ZSwgYWVzKGZpbGwgPSBTQUxFUFJJQ0UpKSArCiAgc2NhbGVfZmlsbF92aXJpZGlzX2MobmFtZSA9ICJQcm9wZXJ0eSBWYWx1ZSIsIG5hLnZhbHVlID0gIndoaXRlIikgKyAjIEFkanVzdCBjb2xvciBzY2FsZSBhcyBuZWVkZWQKICB0aGVtZV92b2lkKCkKCiMgU2F2ZSB0aGUgcGxvdCBhcyBhIGhpZ2gtcmVzb2x1dGlvbiBpbWFnZQojZ2dzYXZlKCJwbG90X3Blcm1pdC5wbmciLCBwbG90LCB3aWR0aCA9IDEwLCBoZWlnaHQgPSA4LCBkcGkgPSAzMDApCgpgYGAKCiMgMy4gTmV4dCBTdGVwcwoKIyMgMy4xIEZlYXR1cmUgRW5naW5lZXJpbmcKCkJlc2lkZXMgdGhlIGZlYXR1cmVzIHdlIGhhdmUgYWxyZWFkeSBleHRyYWN0ZWQsIHdlIHdpbGwgYWxzbyBjb25zaWRlciBtb3JlIGVjb25vbWljIGZlYXR1cmVzIGludG8gb3VyIG1vZGVsLiBCYXNlZCBvbiB0aGUgZmVhdHVyZXMgd2UgaGF2ZSwgd2Ugd2lsbCBhbHNvIGRvIHNvbWUgZmVhdHVyZSBlbmdpbmVlcmluZyB0byBjcmVhdGUgbmV3IGZlYXR1cmVzIGFuZCBqb2luIHRoZSBkYXRhIHRvIHBhcmNlbC4gRm9yIGV4YW1wbGUsIHdlJ3JlIGdvaW5nIHRvIGNhbGN1bGF0ZSB0aGUgYXZlcmFnZSwgbWluaW11bSBhbmQgbWF4aW11bSBzbG9wZSBvZiB0aGUgcGFyY2VsLgoKQWZ0ZXIgam9pbmluZyBmZWF0dXJlcyB3aXRoIHRoZSBwYXJjZWxzLCB3ZSB3aWxsIHRyeSB0byB0ZXN0IHRoZSB2YXJpYWJsZSBjb3JyZWxhdGlvbnMgYmV0d2VlbiB0aGUgdGFyZ2V0IHZhcmlhYmxlIChOdW1iZXIgb2YgU2VwdGljIHBlcm1pdHMgaW4gZWFjaCBwYXJjZWwpIGFuZCB0aGUgZmVhdHVyZXMuIEJhc2VkIG9uIHRoZSB2YXJpYWJsZSBjb3JyZWxhdGlvbiBzaWduaWZpY2FuY2UsIHdlIHdpbGwgdHJ5IHRvIHNlbGVjdCB0aGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgZm9yIHRoZSBtb2RlbC4KCiMjIDMuMiBNYWNoaW5lIExlYXJuaW5nIE1vZGVsCgpPbiB0aGUgYmFzaXMgb2YgdGhlIHZhcmlhYmxlcyBmcm9tIHRoZSBwYXN0IDUgeWVhcnMgd2UgaGF2ZSwgd2Ugd2lsbCB0cnkgdG8gYnVpbGQgYSBtYWNoaW5lIGxlYXJuaW5nIG1vZGVsIHRvIHByZWRpY3QgdGhlIG51bWJlciBvZiBzZXB0aWMgcGVybWl0cyBpbiBlYWNoIHBhcmNlbC4gV2Ugd2lsbCB0cnkgdG8gdXNlIGRpZmZlcmVudCBtb2RlbHMgdG8gcHJlZGljdCB0aGUgbnVtYmVyIG9mIHNlcHRpYyBwZXJtaXRzLCBzdWNoIGFzIGxpbmVhciByZWdyZXNzaW9uLCByYW5kb20gZm9yZXN0LCBhbmQgZ3JhZGllbnQgYm9vc3RpbmcuIFdlIHdpbGwgYWxzbyB0cnkgdG8gdXNlIGRpZmZlcmVudCBmZWF0dXJlIHNlbGVjdGlvbiBtZXRob2RzIHRvIHNlbGVjdCB0aGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZXMgZm9yIHRoZSBtb2RlbC4gVGhlbiB3ZSB3aWxsIGNvbXBhcmUgdGhlIHBlcmZvcm1hbmNlIG9mIGRpZmZlcmVudCBtb2RlbHMgYW5kIGZlYXR1cmUgc2VsZWN0aW9uIG1ldGhvZHMgdG8gZmluZCB0aGUgYmVzdCBtb2RlbCBmb3Igb3VyIHByZWRpY3Rpb24uCgpUaGVuLCB3ZSBwbGFuIHRvIGltcHJvdmUgb3VyIGJhc2VsaW5lIG1vZGVsIHdpdGggc2V2ZXJhbCBkaWZmZXJlbnQgbWV0aG9kcywgc3VjaCBhcyBoeXBlci1wYXJhbWV0ZXIgdHVuaW5nLCBjcm9zcy12YWxpZGF0aW9uLCBhbmQgZW5zZW1ibGUgbGVhcm5pbmcuIFdlIHdpbGwgYWxzbyB0cnkgdG8gdXNlIGRpZmZlcmVudCBtZXRyaWNzIHRvIGV2YWx1YXRlIHRoZSBtb2RlbCBwZXJmb3JtYW5jZSwgc3VjaCBhcyBSTVNFLCBNQUUsIGFuZCBSLXNxdWFyZWQuCgojIyAzLjMgSW50ZXJhY3RpdmUgQXBwbGljYXRpb24KClRoZSBsYXN0IHN0ZXAgd2UgcGxhbiB0byBkbyBpcyB0byBkZXZlbG9wIGFuIGludGVyYWN0aXZlIGRhc2hib2FyZCB0byB2aXN1YWxpemUgYW5kIGVuYWJsZSB0aGUgY2xpZW50cyB0byBpbnRlcmFjdCB3aXRoIHRoZSBkYXRhIG1vcmUgZWFzaWx5LiBJbiB0aGUgZGFzaGJvYXJkLCB3ZSB3aWxsIGluY2x1ZGUgdGhlIGRhdGEgZGFzaGJvYXJkIGFuZCB0aGUgbWFjaGluZSBsZWFybmluZyBtb2RlbCBwcmVkaWN0aW9uIHJlc3VsdCBvbiB0aGUgbWFwIGFzIHN1Z2dlc3Rpb25zIGZvciBXYXRhdWdhJ3MgZnV0dXJlIGRldmVsb3BtZW50Lgo=